Regex Awk-gensub变换

Regex Awk-gensub变换,regex,awk,substitution,Regex,Awk,Substitution,按预期结果为“0.123*10^2”。 有没有办法告诉它计算“12.3”这个词 一般情况:是否有方法修改/转换匹配项(\\1,\\2,…)您只需使用printf指定输出格式: echo "0.123e2" | gawk '{print gensub(/([0-9]+\.[0-9]+)e([0-9]+)/, "\\1 * 10 ^ \\2", "g")}' 使用perl可能会更容易: $ echo "0.123e2" | awk '{printf "%.1f\n",$0}' 12.3 使用您

按预期结果为“0.123*10^2”。 有没有办法告诉它计算“12.3”这个词


一般情况:是否有方法修改/转换匹配项(\\1,\\2,…)

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

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

使用perl可能会更容易:

$ echo "0.123e2" | awk '{printf "%.1f\n",$0}' 
12.3
使用您的测试数据:

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

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

我不需要这个呆板的脚本,只需要在这个字符串上使用它。它适用于此格式中的所有类型的数字0。[number]e[number]并用其计算值替换它。我不管你是想更改科学记数法中一个数字的格式还是1000万的格式。。在
awk
中执行此操作的正确方法是使用
printf
sprintf
函数。据我所知,printf没有正则表达式匹配函数。如果我弄错了,请纠正我,但我认为我必须使用一个正则表达式匹配函数,如gensub,用于更“随机”的输入流,例如:“…0.123e2 xyz/$&”0.3322e12)282 abc。。。“就是这样。将格式从科学浮点更改为十进制浮点与regexp毫无关系!您肯定不想要regexp.ok,那么您将如何处理我建议的“更随机”测试字符串?
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