Awk求和是在没有浮点精度的情况下进行的

时间:2017-08-22 10:56:39

标签: bash awk sum

我有一个 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

http://www.yiiframework.com/doc-2.0/guide-structure-assets.html

如何正确地对列进行求和?

2 个答案:

答案 0 :(得分:7)

当您可以将print与格式修饰符一起使用时,不要在Awk中使用printf()来保持浮点精度。例如。使用printf进行相同的2位精度控制,如下所示

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

来自GNU Awk - Modifiers for printf Formats部分精度状态下的

  

.prec

     

一个句点后跟一个整数常量指定打印时要使用的精度。精度的含义因控制字母而异:

作为旁注,您可以将print语句与下面指定的特殊awk变量OFMT一起使用,

GNU Awk - Controlling Numeric Output with print

  

预定义变量OFMT包含print在将数字转换为字符串进行打印时sprintf()OFMT一起使用的格式规范。 "%.6g"的默认值为OFMT。打印打印数字的方式可以通过为OFMT

的值提供不同的格式规范来更改

这样可以修改您的示例以定义BEGIN子句中的awk -F '^' 'BEGIN { OFMT="%.2f" }{ sum += $5 } END { print sum }' file 15344.24 以使用两位精确控制进行打印,即

{{1}}

此选项适用于所有POSIX compliant Awk个版本。

答案 1 :(得分:3)

试试这个:

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

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