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

Posted

技术标签:

【中文标题】正则表达式从bash脚本中的字符串中提取第一个浮点数【英文标题】:Regex to extract the first float number from a string in bash script 【发布时间】:2013-11-07 06:38:48 【问题描述】:

我使用的是 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】:

您的 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"

编辑以响应 cmets - 新版本的脚本包含循环和那里提到的 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.000000 1 1.66667 1错误:'select S4(x,y,2.000000 1,1.66667 1) from Input1' 错误^发现“1”(在字符 24 处)期望 USING' or ')'' 或 '','' 如果只有这个额外的 1 它正在返回可以删除 2.000000 1 和 1.66667 1 我认为它会运行..请帮我解决这个问题,非常感谢:) 很抱歉。我已经对上面的 sed 调用进行了修改 - 请再试一次。 还有一个问题:-我正在尝试在嵌套的for循环中执行上述操作,它循环遍历表Input1中的列,Shell脚本-> 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 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" done done 错误继续下面的评论.... 这是它给出的错误 ============================== 错误:操作取消错误: 外部表 : 错误输入行数达到 maxerrors 限制 请参阅 /panfs/panfs.ccr.buffalo.edu/scratch/Netezza_UDA/INPUT1.ANKITDES_DB.nzlog 文件错误:加载失败,未插入记录。错误:未找到属性“X”错误:未找到属性“Y”错误:“从 Input1 中选择 S4(x,y,,)”错误 ^ 找到“,”(在字符 15 处)期望标识符找到关键字 您没有正确地将列名替换为对nzsql 的调用,该调用将输入馈送到sed。请参阅上面的修改。

以上是关于正则表达式从bash脚本中的字符串中提取第一个浮点数的主要内容,如果未能解决你的问题,请参考以下文章

带有正则表达式的 Bash 子字符串

在普通bash中使用正则表达式提取子字符串

在猪脚本中使用正则表达式从日志中提取字符串

如何使用正则表达式从字符串中提取第 n 个 URL?

linux学习第4天(自习)

外壳脚本。如何使用正则表达式提取字符串