使用awk重新格式化浮点数

时间:2013-07-29 17:13:59

标签: bash awk floating-point format

我希望匹配输入中的所有浮点数,并用不同格式的浮点数替换它们。

这是我尝试过的东西:

echo "123.45E+00 blah 678.90E+00 blah 3.1415926535897932E+0000" \
    | awk '{gsub(/[0-9]+\.[0-9]+\E\+[0-9]+/,sprintf("%E","&")); print $0}'

不幸的是,sprintf中的"&"是一个字符串而不是一个数字,结果是:

0.000000E+00 blah 0.000000E+00 blah 0.000000E+00

这是我想要的数字格式,但使用"&"导致零作为参数的值,而不是匹配的数字。

"%E"格式更改为"%s"的工作原理是返回原始字符串。

我想要上述输入的输出是:

1.234500E+02 blah 6.789000E+02 blah 3.141593E+00

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

echo "123.45E+00 blah 678.90E+00 blah 3.1415926535897932E+0000" |
  awk '{
    for (i=1; i<=NF; i++)
      sub(/[0-9]+\.[0-9]+\E\+[0-9]+/, sprintf("%.6E", $i), $i)
  }1'