Linux中如何用printf "%.2f\n"修改所有列的小数位数
处理Linux终端中所有列的小数位数统一格式化
没问题!你已经掌握了单列的awk格式化技巧,要扩展到所有列其实只需要对awk的逻辑做一点小调整,这里给你两种实用的方法:
方法一:遍历所有列(最稳妥,适配所有场景)
这是通用性最强的方案,不管你的文件有多少列、列分隔符是什么,都能完美处理。核心思路是用for循环遍历每一行的所有列(NF代表当前行的总列数),对每一列单独做两位小数的格式化,最后按原分隔符拼接输出:
awk '{ for(i=1; i<=NF; i++) { # 格式化当前列为两位小数,最后一列换行,其他列加空格分隔 printf("%.2f%s", $i, (i==NF) ? "\n" : " ") } }' file > file2
适配自定义分隔符(比如CSV文件)
如果你的文件用逗号、制表符等其他符号分隔,只需要指定FS(输入分隔符)和OFS(输出分隔符)即可,比如处理CSV文件:
awk -F',' -v OFS=',' '{ for(i=1; i<=NF; i++) { printf("%.2f%s", $i, (i==NF) ? "\n" : OFS) } }' file.csv > file2.csv
方法二:利用OFMT变量(简洁版,适合纯数值文件)
如果你的文件所有列都是数值,没有非数字内容,可以用awk内置的OFMT变量直接设置默认输出格式,一行命令搞定:
awk -v OFMT="%.2f" '{print}' file > file2
不过要注意:这个方法会把所有输出的数值统一应用这个格式,但如果有非数值列(比如字符串),可能会被错误转换为0.00,所以只推荐纯数值场景使用。
示例效果
假设原文件file内容是:
1 0.5 3.1415 2.2 4 5.678
用方法一处理后,file2的内容会变成:
1.00 0.50 3.14 2.20 4.00 5.68
内容的提问来源于stack exchange,提问作者Amir Aliakbari
相关产品推荐
相关产品推荐

