请注意,所有输入都被视为字符串,直到通过使用方式进行隐式转换。
OFMT
用于将字符串转换为数字时打印数字,例如:
<<< 0.77767686 awk '{ print 0+$0 }' OFMT='%.2g'
CONVFMT
当数字显式转换为字符串时使用,例如:
<<< 0.77767686 awk '{ print "" 0+$0 }' CONVFMT='%.2g'
两种情况下的输出:
0.78
后者转换$0
为数字,然后将其与空字符串连接。
为了为每一列实现这一点,我建议使用输入和输出记录分隔符的合理设置:
<<< '0.77767686 0.76555555 0.6667667 0.77878878' \
awk '{ print 0+$0 RT }' CONVFMT='%.2g' RS='[ \t\n]+' ORS=''
请注意这两种转换,首先是一个数字,0+$0
然后通过将其与 连接起来返回一个字符串RT
。RT
将设置为匹配的记录分隔符。请注意,这是 GNU awk 特定的,对于更便携的解决方案,请使用循环,例如:
<<< '0.77767686 0.76555555 0.6667667 0.77878878' \
awk '{ for (i=1; i<=NF; i++) $i+=0 } 1' CONVFMT='%.2g'
两种情况下的输出:
0.78 0.77 0.67 0.78
编辑 - 回复@BeeOnRope
@BeeOnRope 是正确的,OFMT
在 print 函数调用时用作格式说明符sprintf()
,而CONVFMT
在其他转换中使用。这是一个说明差异的示例:
<<< 0.77767686 awk '{ n=0+$1; s=""n; print n, s }' OFMT='%.2g' CONVFMT='%.3g'
输出:
0.78 0.778
GNU awk 手册中的两个相关部分: