什么是awk的输出' BEGIN {sum = 0} END {print sum}'文件名?

时间:2016-08-10 10:11:19

标签: linux unix awk command open-source

以下命令的输出是什么?

awk 'BEGIN{sum=0}END{print sum}'filename

如果我们只声明BEGIN和END块,会发生什么?响应应该是以下之一:

  • 一个。文件中存在的所有值的总和
  • 湾0
  • ℃。命令无法运行
  • d。以上都不是

现在它只是在执行后在终端中给出暂停状态。我能知道为什么吗?

1 个答案:

答案 0 :(得分:1)

首先,您需要在文件名之前写一个空格,以便awk将其识别为:

awk 'BEGIN {sum=0} END {print sum}' filename
#                                  ^

否则,当您说awk '...things...'file没有空格时,awk会将'...things...'file视为一个整体,但仍希望处理该文件。

这就是说,除了打印0

之外什么也没做
$ cat file
1
2
3
$ awk 'BEGIN {sum=0} END {print sum}' file
0

为什么会这样?好吧,在你执行之前的(在BEGIN中)和之后的(在END中)读取文件之前,而不是在执行此操作之前。然后,由于您只是将变量设置为0然后打印它,您可以期望输出为0

awk撰写patterns and actions。这意味着您需要执行某种操作才能创建一些内容。这由以下任何一个表达:

[pattern]  { action }
 pattern  [{ action }]

因此,要对文件中的所有行执行求和,您需要对{sum+=$0}的类型执行某种操作,这将保留一个计数器:

$ awk 'BEGIN {sum=0} {sum+=$0} END {print sum}' file
6

不过,我们可以跳过BEGIN {sum=0}的使用,因为任何变量都默认为0,因此您无需设置它:

$ awk '{sum+=$0} END {print sum}' file
6

如果文件是空的怎么办?

$ rm file
$ touch file
$ awk '{sum+=$0} END {print sum}' file

你看到这不会返回任何东西。要涵盖这种情况,请使用sum+0以便在打印时动态设置变量:

$ awk '{sum+=$0} END {print sum+0}' file
0

我建议你阅读一本awk手册,例如Arnold Robbins的GNU awk user's guide或Effective AWK,第4版(嘿Ed Morton我先建议它!)。