Skip to content Skip to main navigation Skip to footer

AWK 浮点数加法运算的结果如何依旧为浮点数

在我这样的一个需求:通过awk从一个文本文件中过滤出包含“gor”字符串的行,并计算出每行中第二个字段(浮点数)的累加和。当执行完awk后,得到的结果却是四舍五入后的整数,而我们期望的结果是浮点数值,类似于345.33,不是345.
awk 命令如下:
grep ‘gor’ try.txt | awk ‘BEGIN{ sum=0.0}{ sub(“,”,””,$2); sum +=$2}END{ print “$” sum}’
$345
那么我们才能得到想要的345.33这样的浮点数值输出呢?
awk 默认情况下会以双精度浮点数来表示所有的数值。换句话说,所有的数在awk里皆浮点数,所有的算数操作都以浮点数来进行。
示例:AWK 浮点运算
这个的例子将会使用一个叫try.txt的文件,该文件包含了一些数值。
[cc lang=”php”] d1 18.2 14.2
d2 11.5 6.60
d3 4.5  4.30
d4 2.5 17.5
d5 3    5
[/code] 下面的awk脚本将会计算第二字段和第三个字段的总和
[cc lang=”php”] awk ‘{ sum = $2 + $3; print $1, sum }’ try.txt
[/code] 脚本输出结果:
[cc lang=”php”] d1 32.4
d2 18.1
d3 8.8
d4 20
d5 8
[/code] awk对每个字段求平均值
[cc lang=”php”] awk ‘{ sum = $2 + $3; avg = sum/2; print $1, sum , avg}’ try.txt
[/code] 输出结果:
[cc lang=”php”] d1 32.4 16.2
d2 18.1 9.05
d3 8.8 4.4
d4 20 10
d5 8 4
[/code]  
输出内容格式化
在awk中我们可以类似于C语言中的printf,这样可以输出更好看更有意义的结果
[cc lang=”php”] awk ‘{ sum = $2 + $3 ; avg = sum/4; printf “%s: $%.2f ($%05.2f)n”,$1, sum, avg}’ try.txt
[/code] 输出结果:
[cc lang=”php”] d1: $32.40 ($08.10)
d2: $18.10 ($04.53)
d3: $8.80 ($02.20)
d4: $20.00 ($05.00)
d5: $8.00 ($02.00)
[/code] 回到刚开始的问题,我们可以用下面的awk命令来替换之前的命令:
[cc lang=”php”] grep ‘gor’ testing.txt  | awk ‘BEGIN{ sum=0.0}{ sub(“,”,””,$2); sum +=$2}END{printf “$%.2fn”, sum}’
[/code] 推荐阅读:
.更多信息可参考awk命令man帮助

0 Comments

There are no comments yet

Leave a comment

Your email address will not be published.