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