I have a file.txt and I'm trying to summarize the values of the fourth and fifth columns:
^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
I get the following result: 15344.2
$awk -F '^' '{sum += $6} END {print sum}' file.txt
I get the following result: 30.48
Then I checked the result in the Excel. It turned out that the awk addition was wrong in the first addition. Missing 0.04.

How to sum the column correctly?
Don't leave the floating point precision by using print in Awk, when you can use printf() with format-modifiers. E.g. do the same with printf with 2 digit precision control as below
awk -F '^' '{ sum += $5 } END { printf "%0.2f",sum }' file
15344.24
from the GNU Awk - Modifiers for printf Formats under section precision states,
.precA period followed by an integer constant specifies the precision to use when printing. The meaning of the precision varies by control letter:
As a side note you can use print statement with a special awk variable OFMT as specified below,
GNU Awk - Controlling Numeric Output with print
The predefined variable
OFMTcontains the format specification thatsprintf()when it wants to convert a number to a string for printing. The default value ofOFMTis"%.6g". The way print prints numbers can be changed by supplying a different format specification for the value ofOFMT
This way your example can be modified to define the OFMT in the BEGIN clause to print with two digit precision control, i.e.
awk -F '^' 'BEGIN { OFMT="%.2f" }{ sum += $5 } END { print sum }' file
15344.24
This option is available in all POSIX compliant Awk versions.
Try this:
awk -F '^' '{sum += $5} END {printf "%.2f\n", sum}' file.txt
"%.2f" will make sure it is rounded to 2 decimal places.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With