以下命令的输出是什么?
awk 'BEGIN{sum=0}END{print sum}'filename
如果我们只声明BEGIN和END块,会发生什么?响应应该是以下之一:
现在它只是在执行后在终端中给出暂停状态。我能知道为什么吗?
答案 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我先建议它!)。