Closed. This question needs
details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过
editing this post阐明问题。
3年前关闭。
以下命令的输出是什么?
awk 'BEGIN{sum=0}END{print sum}'filename
如果仅声明BEGIN和END块,将会发生什么?响应应为以下之一:
一种。文件中所有值的总和
b。 0
C。命令将无法运行
d。以上都不是
现在它只是在执行后在终端中给出暂停状态。我能知道为什么吗?
首先,您需要在文件名之前写一个空格,以便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
You see this is not returning anything. To cover this case, use sum+0
so that the variable will be set on the fly when printing it:
$ awk '{sum+=$0} END {print sum+0}' file
0
我建议您阅读awk手册,例如Arnold Robbins撰写的
GNU awk user's guide或Effective AWK,第4版(嘿,艾德·莫顿,我首先建议过!!)。