繁体   English   中英

AWK将列的所有值求和,并保持所有浮点数

[英]AWK sum all values of a column keeping all floats

我正在使用以下代码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 ...

怎么了?

我认为问题出在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

为什么不起作用?

GNU Awk用户指南5.5.1 printf语句简介

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

 printf format, item1, item2, … 

对于打印,整个参数列表可以选择用括号括起来

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

格式字符串与ISO C库函数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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM