我已经运行了以下代码:
awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
得到
red
但是,当我执行以下两个代码时:
awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}{print color["one"] }'
和
awk '{ color["one"]="red"; color["two"]="orange";print color["one"] }'
执行似乎无效。为什么我不能将color["one"]
放在第一个无效代码的正文中?另外,为什么我必须将color["one"]="red"; color["two"]="orange";print color["one"]
放在开始块中?谢谢。
答案 0 :(得分:1)
是的,这是预期的行为,因为BEGIN
中的awk
部分在读取Input_file之前已执行,因此它不需要您传递任何Input_file名称,因此第一个awk
可以工作。但是在其他awk
中,您关闭了BEGIN
部分,然后通过{...}
打开了一个MAIN BLOCK,因此它需要一个Input_file来执行。
也请参见man awk
页上的以下内容:
BEGIN and END are two special kinds of patterns which are not tested against the input. The action parts of all BEGIN patterns are
好像合并 所有语句都写在单个BEGIN块中。在读取任何输入之前执行它们。同样,所有 END块 合并,并在所有输入都用尽时(或在执行exit语句时)执行。开始和结束模式 不能合并 与模式表达式中的其他模式。 BEGIN和END模式不能缺少动作部分。
您的第1个 awk
:
awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
在BEGIN
部分之后,没有给出任何语句,因此它可以正常工作并给出red
作为输出。
您的第二个awk
:让我们将其分为2部分
第一部分(用于理解):
awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}
第二部分(用于理解):
{print color["one"] }'
因此,第一部分是BEGIN
部分,第二部分是main block
,期望将Input_file传递给awk
程序。
回答为何在 BEGIN
部分: 中初始化变量或数组的原因
对于您的问题,为什么必须在BEGIN
块中初始化变量或数组是因为在读取Input_file时BEGIN
节在主块之前执行了,因此最好在那里进行变量和数组的所有初始化避免它们重新启动或以某种条件启动它们(每次读取每一行都会检查一次)。这就是为什么建议恕我直言在BEGIN
部分对其进行初始化的原因。