awk没有与OFMT和$ 0进行四舍五入

use*_*165 4 awk gawk

我正在打印一个包含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)

Tho*_*hor 9

请注意,所有输入都被视为字符串,直到按其使用方式进行隐式转换.

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)