Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex从bash脚本中的字符串中提取第一个浮点数_Regex_Bash_Netezza - Fatal编程技术网

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
调用中。请参见上面的编辑。