AWK汇总列的所有值,保留所有浮点数

时间:2016-05-12 13:04:40

标签: awk floating-point sum printf

我使用以下代码来grep我感兴趣的行,只保留最后一行并总结第九列:

grep -n -49 'FINAL BlaBla' output |tail -9 | awk 'BEGIN {SUM=0}; {SUM=SUM+$9}; END {printf "%.3f\n" SUM}.

然而,第9列的总和返回0,000

所选行如下所示

84-    C    -3.42056726    +1    -0.82831327    +1    1.52743549    +1    0.5647
85-    N    -4.78612760    +1    -1.01185554    +1    1.58894854    +1   -0.5837
86-    C    -5.19047197    +1    -2.20130686    +1    2.06176295    +1    0.3890
87-    N    -4.42537785    +1    -3.22689397    +1    2.47304603    +1   -0.4775
88-    C    -3.03532546    +1    -2.98933854    +1    2.38795560    +1    0.3686
89-    N    -2.51737448    +1    -1.78267672    +1    1.92262528    +1   -0.5526
90-   Cl    -6.86455806    +1    -2.45050886    +1    2.15229544    +1    0.0934
91-    N    -2.24043582    +1    -3.93651444    +1    2.76082642    +1    0.0890
92-    N    -2.94053526    +1     0.36941710    +1    1.06455738    +1   -0.3274

我无法找出错误的位置。

我还试图总结超过1美元而且我正确地获得792,000但是当我总结超过3美元时我得到31,000 ...

出了什么问题?

1 个答案:

答案 0 :(得分:4)

我认为问题在于printf表达式中缺少逗号:

$ awk 'BEGIN {SUM=0}; {SUM=SUM+$9}; END {printf "%.3f\n", SUM}' file
#                                                       ^ 
#                                                     comma!
-0.436

请注意,不需要将变量设置为零,因为这是默认值。所以放下BEGIN {}块并离开:

awk '{sum+=$9}; END {printf "%.3f\n", sum}' file

对于其他领域:

$ awk '{sum+=$nvar}; END {printf "%.3f\n", sum}' nvar=1 file
792.000
$ awk '{sum+=$nvar}; END {printf "%.3f\n", sum}' nvar=3 file
-35.421
$ awk '{sum+=$nvar}; END {printf "%.3f\n", sum}' nvar=9 file
-0.436

为什么不工作?

来自The GNU Awk user's guide 5.5.1 Introduction to the printf Statement

  

一个简单的printf语句如下所示:

printf format, item1, item2, …
     

对于print,可以选择包含整个参数列表   在括号中

     

printf和print之间的区别是format参数。这个   是一个表达式,其值为字符串;它指定了如何   输出每个其他参数。它被称为格式字符串。

     

格式字符串与ISO C库中的格式字符串非常相似   function printf()。大多数格式是逐字输出的文本。   在这个文本中分散的是格式说明符 - 每个项目一个。每   格式说明符表示输出参数列表中的下一个项目   那个地方的格式。

因此,如果您不使用逗号来调用字段,则会收到此错误:

$ awk 'BEGIN {printf "%.3f" 3}'
awk: cmd. line:1: fatal: not enough arguments to satisfy format string
    `%.3f3'
       ^ ran out for this one

使用它们有效!

$ awk 'BEGIN {printf "%.3f", 3}'
3.000
相关问题