Awk浮点数相加结果意外

时间:2020-01-09 10:42:05  来源:igfitidea点击:

我正在使用awk从文本文件grep foo并计算字段7的和。
但是,结果四舍五入为整数。
如何使用以下命令的准确结果,例如385858.66,而不是385858:

grep foo 2012-2013.txt | awk BEGIN {sum = 0.0} {sub(, $7); sum + = $7} END {print $sum}$682444

如何要$682444.57作为输出。
如何强制awk进行浮点数学运算?
浮点数或者实数是小数部分。

awk使用双精度浮点数表示所有数字值。
换句话说,awk中的所有数字都是浮点数,即所有使用浮点数完成的计算。

示例:Awk浮点计算

以下示例使用一个名为trade.txt的文件,该文件包含一个星期名称列表以及每周四个利润值:

week1 12.5 12.5 13.5 18.5
week2 11.5 11.10 12.10 13.70
week3 8.5  8.10 8.5 12.5
week4 9.5 11.5 13.5 16.5
week5 8	7 13 17

以下awk程序使用文件trade.txt并打印所有四个值的总和:

awk '{ sum =  +  +  + ; print , sum }' trade.txt

输出示例:

week1 57
week2 48.4
week3 37.6
week4 51
week5 45

以下awk程序采用文件trade.txt并打印所有四个值的平均值:

awk '{ sum =  +  +  + ; avg = sum/4; print , sum , avg}' trade.txt

输出示例:

week1 57 14.25
week2 48.4 12.1
week3 37.6 9.4
week4 51 12.75
week5 45 11.25

为避免意外,请使用printf设置文本格式,以使您的输出更加美观和有意义:

awk '{ sum =  +  +  + ; avg = sum/4; printf "%s: $%.2f ($%05.2f)\n",, sum, avg}' trade.txt

或者

awk '{ sum =  +  +  + ; avg = sum/4; printf "%s: $%.2f ($%5.2f)\n",, sum, avg}' trade.txt

输出示例:

week1: .00 (.25)
week2: .40 (.10)
week3: .60 ($ 9.40)
week4: .00 (.75)
week5: .00 (.25)

要解决您的问题,请替换以下awk代码

grep 'foo' 2012-2013.txt  | awk 'BEGIN{ sum=0.0}{ sub(",","",); sum +=}END{ print "$" sum}'

与:

grep 'foo' 2012-2013.txt  | awk 'BEGIN{ sum=0.0}{ sub(",","",); sum +=}END{  printf "$%.2f\n", sum}'

您可以跳过grep命令并按如下所示使用awk来匹配并执行所有$7的总和:

awk '/foo/{ sub(",","",); sum = old + ; old=sum}END{ printf "$%.2f\n", sum}' 2013-2014.txt