我有几行,例如:
N2O + M = N2 + O + M 1.300E+11 0.00 59620.0
我需要用一个不能与 一起使用的因子来替换倒数第三个字段awk
。但是,如果我在最后一个字段甚至倒数第二个字段上应用相同的表达式,它就会起作用。我分别用科学计数法和 进行了测试awk
,它有效。示例如下:
#works as expected; last field gets multiplied by -1
echo "N2O + M = N2 + O + M 1.300E+11 0.00 59620.0" | awk '{gsub($(NF),-1.0*$(NF))};{print}'
N2O + M = N2 + O + M 1.300E+11 0.00 -59620
#does not work; third from last field stays unchanged
echo "N2O + M = N2 + O + M 1.300E+11 0.00 59620.0" | awk '{gsub($(NF-2),-1.0*$(NF-2))};{print}'
N2O + M = N2 + O + M 1.300E+11 0.00 59620.0
关于为什么会发生这种情况有什么建议吗?
答案1
答案可以在人 awk:
通过替换将数值表达式转换为字符串表达式与
sprintf(CONVFMT, expr)
, 除非表达式可以在主机上表示为精确整数,然后将其转换为sprintf("%d", expr)
.
斯普林特夫()sprintf(3)
是一个 AWK 内置函数,它复制, 和的功能卷积FMT是一个内置变量,用于从数字到字符串的内部转换,并初始化为"%.6g"
.
所以当你调用gsub
使用字符串操作的函数时awk已将字段转换为sprintf("%d", 1.300E+11)
,130000000000
但行中没有此类文本,因此无需替换。