Awk gensub转型

时间:2013-05-13 18:37:58

标签: regex awk substitution

echo "0.123e2" | gawk '{print gensub(/([0-9]+\.[0-9]+)e([0-9]+)/, "\\1 * 10 ^ \\2", "g")}'

按预期结果给出“0.123 * 10 ^ 2”。 有没有办法真正告诉它将术语计算为“12.3”?

一般情况下:有没有办法修改/转换匹配项(\\ 1,\\ 2,...)?

2 个答案:

答案 0 :(得分:1)

您只想使用printf指定输出格式:

$ echo "0.123e2" | awk '{printf "%.1f\n",$0}' 
12.3

答案 1 :(得分:1)

使用perl可能会更容易:

perl -pe 's/(\d+\.\d+e\d+)/ sprintf("%.1f",$1) /ge' filename

使用您的测试数据:

echo '0.123e2 xyz/$&" 0.3322e12)282 abc' | perl -pe 's/(\d+\.\d+e\d+)/ sprintf("%.1f",$1) /ge'
12.3 xyz/$&" 332200000000.0)282 abc

使用awk:

awk '{ 
      while ( match( $0, /[0-9]+\.[0-9]+e[0-9]+/ ) > 0 ) {
       num = sprintf("%.1f", substr( $0, RSTART, RLENGTH ) )
       sub( /[0-9]+\.[0-9]+e[0-9]+/, num )
      }
       print $0
    }' filename