我使用extract the first number from a string上一篇文章中的$xavg | sed -r 's/^([^.]+).*$/\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 'select S4(x,y,aum,nol) from test'
给出了“AUM”的错误,但是当我回显给出2时,会打印相同的值。
如果有人可以帮我解决正则表达式和S4中的错误(x,y,aum,nol),我会很感激
答案 0 :(得分:1)
您的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