我使用以下代码来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 ...
出了什么问题?
答案 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