2

我使用$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) 中的错误,我将不胜感激

4

1 回答 1

2

您的 sed 脚本仅匹配到第一个小数点之前(无论如何都可以简化)。从您在下面的评论中,您似乎只想处理nzsql包含数字的第一行输出。此外,没有 sed 脚本可以就地编辑 shell 变量(您似乎正在尝试使用xavgand来执行此操作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
于 2013-11-07T06:54:35.963 回答