正则表达式从bash脚本中的字符串中提取第一个浮点数

时间:2013-11-07 06:38:48

标签: regex bash netezza

我使用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),我会很感激

1 个答案:

答案 0 :(得分:1)

您的sed脚本只匹配在第一个小数点之前(并且无论如何都可以简化)。从下面的评论中,您似乎只想处理包含数字的nzsql的第一行输出。此外,没有sed脚本可以编辑shell变量(您似乎尝试使用xavgyavg执行此操作)。

变量nolaum的位看起来多余。

然后你的最后一个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