为什么我需要在开始块中初始化变量

时间:2018-11-29 06:54:18

标签: awk

我已经运行了以下代码:

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"]放在开始块中?谢谢。

1 个答案:

答案 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部分对其进行初始化的原因。