Awk求和运算不使用浮点精度

4
我有一个名为file.txt的文件,我想要汇总第四列和第五列的值:
^20170821^3007030^153^863.53^0.42^
^20170821^1402675^110^581.36^0.37^
^20170821^1404785^24^155.29^0.29^
^20170821^1406505^40^210.51^0.00^
^20170821^1005^1^18.00^0.00^
^20170821^9657^7^7.28^0.00^
^20170821^143646^86^486.59^0.08^
^20170821^342657^3^12.60^0.00^
^20170821^1006^4^7.04^0.04^
^20170821^1004^1215^3502.44^12.09^
^20170821^1007^932^6689.64^15.07^
^20170821^378228^1^2.80^0.00^
^20170821^704797^4^23.80^0.00^
^20170821^705642^2^9.80^0.00^
^20170821^703689^7^40.60^0.00^
^20170821^148340^75^382.81^0.20^
^20170821^257^2^5.60^0.00^
^20170821^3702^1^2.80^0.00^
^20170821^3703^1^7.00^0.00^
^20170821^258^1^7.00^0.00^
^20170821^920299^11^60.20^0.00^
^20170821^210705^2^14.00^0.00^
^20170821^867693^12^65.88^0.08^
^20170821^2635085^6^33.60^0.00^
^20170821^13211^140^409.18^0.58^
^20170821^64^2^14.00^0.00^
^20170821^13214^234^1685.91^1.26^
^20170821^13212^2^34.90^0.00^
^20170821^13213^2^2.80^0.00^
^20170821^18385^8^7.28^0.00^


 $awk -F '^' '{sum += $5} END {print sum}' file.txt

我得到了以下结果:15344.2
 $awk -F '^' '{sum += $6} END {print sum}' file.txt

我得到了以下结果:30.48 然后我在Excel中检查了结果。结果显示,在第一次加法中,awk加法错误,缺少0.04

enter image description here

如何正确地对列求和?
2个回答

8

Awk中,使用printf()和格式修饰符而不是print来避免浮点精度问题。例如,使用下面的printf控制2位精度。

awk -F '^' '{ sum += $5 } END { printf "%0.2f",sum }' file
15344.24

来自GNU Awk - printf格式修饰符中的精度部分,使用一个整数常量后跟一个句点可指定打印时使用的精度。精度的含义因控制字符而异:


顺便提一下,您可以使用带有特殊awk变量OFMTprint语句,如下所示:

GNU Awk - 控制数字输出 with print

预定义变量OFMT包含print在想将数字转换为字符串进行打印时要使用的格式规范。默认值为"%.6g"。通过提供不同的格式规范作为OFMT的值,可以更改print打印数字的方式。

这样,您的示例就可以修改BEGIN子句中的OFMT以使用两位数精度控制进行打印,例如:

awk -F '^' 'BEGIN { OFMT="%.2f" }{ sum += $5 } END { print sum }' file
15344.24

这个选项在所有符合POSIX规范的Awk版本中都可用。


3

试试这个:

awk -F '^' '{sum += $5} END {printf "%.2f\n", sum}' file.txt 

""%.2f"将确保四舍五入到小数点后2位。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接