Regex从bash脚本中的字符串中提取第一个浮点数
我使用的是Regex从bash脚本中的字符串中提取第一个浮点数,regex,bash,netezza,Regex,Bash,Netezza,我使用的是$xavg|sed-r/^([^.]+).$/\1/;s/^[^0-9]*([0-9]+).$/\1/'来自上一篇文章 但这只给出小数点前的分数。我要第一个浮点数 例如: “abjhjdw20.39auh201”在这个字符串中,我只想要第一个浮点数20.39 在下面的我的bash脚本中:- nzsql -c 'create table Input1(x integer, y integer, v integer)' nzload -t Input1 -df InputTable.txt
$xavg|sed-r/^([^.]+).$/\1/;s/^[^0-9]*([0-9]+).$/\1/'
来自上一篇文章
但这只给出小数点前的分数。我要第一个浮点数
例如:
“abjhjdw20.39auh201”在这个字符串中,我只想要第一个浮点数20.39
在下面的我的bash脚本中:-
nzsql -c 'create table Input1(x integer, y integer, v integer)'
nzload -t Input1 -df InputTable.txt
xavg=`nzsql -c 'select avg(x) from Input1'`
echo $xavg | sed -r 's/^([^.]+).*$/\1/; s/^[^0-9]*([0-9]+).*$/\1/'
aum=xavg
yavg=`nzsql -c 'select avg(y) from Input1'`
echo $yavg | sed -r 's/^([^.]+).*$/\1/; s/^[^0-9]*([0-9]+).*$/\1/'
nol=yavg
echo $nol
nzsql -c 'select S4(x,y,aum,nol) from test'
=======下面的输出=======
CREATE TABLE
Load session of table 'INPUT1' completed successfully
2
1
yavg
ERROR: Attribute 'AUM' not found
实际平均值为2.3和1.6
使用上述正则表达式和nzsql-c从测试中选择S4(x,y,aum,nol)提取的数据给出了“aum”的错误,但当我回显它时会打印出相同的值,给出2
如果有人能帮我处理正则表达式和S4(x,y,aum,nol)中的错误,我将不胜感激。您的sed脚本只匹配到第一个小数点之前(并且无论如何都可以简化)。从下面的评论来看,您似乎只想处理
nzsql
中包含数字的第一行输出。此外,没有任何sed脚本可以在位编辑shell变量(您似乎正在尝试使用xavg
和yavg
)
带有变量nol
和aum
的位看起来是多余的
然后,您的上一个nzsql操作看起来应该在SQL中有两个shell变量替换
总之:
nzsql -c 'create table Input1(x integer, y integer, v integer)'
nzload -t Input1 -df InputTable.txt
xavg=`nzsql -c 'select avg(x) from Input1' | sed -nr '/[0-9]/{s/^[^0-9]*([0-9]+\.?[0-9]*).*$/\1/p;q}'`
echo $xavg
yavg=`nzsql -c 'select avg(y) from Input1' | sed -nr '/[0-9]/{s/^[^0-9]*([0-9]+\.?[0-9]*).*$/\1/p;q}'`
echo $yavg
nzsql -c "select S4(x,y,${xavg},${yavg}) from test"
根据注释进行编辑-包含循环和if语句的脚本新版本:
nzsql -c 'create table Input1(a integer, b integer, c integer)'
nzload -t Input1 -df InputTable.txt
for x in a b c
do
xavg=`nzsql -c "select avg(${x}) from Input1" | sed -nr '/[0-9]/{s/^[^0-9]*([0-9]+\.?[0-9]*).*$/\1/p;q}'`
for y in b c
do
if [[ "${x}" != "${y}" ]]
then
yavg=`nzsql -c "select avg(${y}) from Input1" | sed -nr '/[0-9]/{s/^[^0-9]*([0-9]+\.?[0-9]*).*$/\1/p;q}'`
nzsql -c "select S4(${x},${y},${xavg},${yavg}) from Input1"
else
echo 1
fi
done
done
感谢您的回复:)。它现在给出了小数点后的数字,但还额外返回了一个1。这导致了一个错误。下面是输出:-2.0000001 1.66667 1错误:“从Input1中选择S4(x,y,2.0000001,1.66667 1)错误^found“1”(在char 24处)期望
使用'or
')或`,''如果它返回的这个额外的1可以被删除2.0000001和1.66667 1,我想它会运行..请帮我处理这个,非常感谢:)抱歉。我已经对上面的sed调用进行了修改-请重试。还有一个问题:-我正在尝试在嵌套的for循环中执行上述操作,它在table Input1、Shell script->nzsql-c'create table Input1(a整数、b整数、c整数)中的列中循环nzsql-c“从输入中选择avg(x)从输入中选择avg(x)从从输入中选取(x)从从输入中选取avg(x)从输入中选择avg(x)从输入中选择(x)从输入中选择(x)从1’124;sed-nr'/[0-9-9]/[0-9/[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-9.[0-0-9.[0-9.[0-9]]**....[5-9...[0-9-9]*..[5-9-9]*)*)*))).............*)............................>nzsql-c“选择S4(x,y,${xavg},${yavg})从Input1“done-done Error”继续到下面的注释…这是它给出的错误==================================错误:操作取消错误:外部表:错误输入行数达到最大错误限制请参阅/panfs/panfs.ccr.buffalo.edu/scratch/Netezza_UDA/Input1.ANKITDES_DB.nzlog文件错误:加载失败,未插入记录。错误:属性“X”未找到错误:属性“Y”未找到错误:“从Input1“ERROR^found”中选择S4(X,Y,,)”(在字符15处)期望标识符找到关键字您没有正确地将列名替换到将输入馈送到sed
的nzsql
调用中。请参见上面的编辑。