正则表达式从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 变量(您似乎正在尝试使用 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"
编辑以响应 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脚本中的字符串中提取第一个浮点数的主要内容,如果未能解决你的问题,请参考以下文章