我正在打印一个包含100列的数组,我希望所有列都有2位小数.我想使用print $ 0而不必单独指定所有列的格式.
OFMT确实看起来与0美元一起工作:
echo '0.77767686 0.76555555 0.6667667 0.77878878' |awk '{CONVFMT="%.2g";OFMT="%.2g";print ($0+0);print ($0+0)"";print $0}'
Run Code Online (Sandbox Code Playgroud)
结果:
0.78
0.78
0.77767686 0.76555555 0.6667667 0.77878878
Run Code Online (Sandbox Code Playgroud)
请注意,所有输入都被视为字符串,直到按其使用方式进行隐式转换.
OFMT
字符串转换为数字时使用,例如:
<<< 0.77767686 awk '{ print 0+$0 }' OFMT='%.2g'
Run Code Online (Sandbox Code Playgroud)
CONVFMT
在将数字转换为字符串时使用,例如:
<<< 0.77767686 awk '{ print "" 0+$0 }' CONVFMT='%.2g'
Run Code Online (Sandbox Code Playgroud)
两种情况下的输出:
0.78
Run Code Online (Sandbox Code Playgroud)
后者转换$0
为数字,然后将其与空字符串连接.
为了实现每列的这一点,我建议使用输入和输出记录分隔符的合理设置:
<<< '0.77767686 0.76555555 0.6667667 0.77878878' \
awk '{ print 0+$0 RT }' CONVFMT='%.2g' RS='[ \t\n]+' ORS=''
Run Code Online (Sandbox Code Playgroud)
注意两个转换,首先是一个数字,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'
Run Code Online (Sandbox Code Playgroud)
两种情况下的输出:
0.78 0.77 0.67 0.78
Run Code Online (Sandbox Code Playgroud)