Awk 为什么需要在begin块中初始化变量

Awk 为什么需要在begin块中初始化变量,awk,Awk,我已运行以下代码: awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }' 得到 red 但是,当我执行以下两个代码时: awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}{print color["one"] }' 及 执行似乎不起作用。为什么我不能将color[“one”]放在第一个不工作代码的正文块中?还有,为什么我必须把颜色[“一

我已运行以下代码:

awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
得到

red
但是,当我执行以下两个代码时:

awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}{print color["one"] }'


执行似乎不起作用。为什么我不能将
color[“one”]
放在第一个不工作代码的正文块中?还有,为什么我必须把
颜色[“一”]=“红色”;颜色[“两个”]=“橙色”;在开始块中打印颜色[“一”]
?谢谢。

是的,这是预期的行为,因为在读取输入文件之前执行了
awk
中的
BEGIN
部分,所以它不需要您传递任何输入文件名,因此您的第一个
awk
工作。但是在另一个
awk
中,您关闭了
BEGIN
部分,然后通过
{…}
打开了一个主块,因此需要一个输入文件来执行它

另请参见
man awk
页面中的以下内容:

BEGIN和END是两种特殊的模式,它们没有针对输入进行测试。所有BEGIN模式的动作部分都是 合并 所有语句都写在一个BEGIN块中。它们在读取任何输入之前执行。同样,所有 端块 合并,并在耗尽所有输入(或执行exit语句)时执行。开始和结束模式 不能合并 在模式表达式中使用其他模式。开始和结束模式不能缺少动作部分

您的第一个
awk

awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
BEGIN
部分之后,没有给出任何语句,因此它可以正常工作,并将
红色
作为输出



您的第二个
awk
:让我们将其分为两部分

第一部分(用于理解):

第二部分(用于理解):

所以第一部分是
BEGIN
部分,第二部分是主块,它期望一个输入文件被传递到
awk
程序

回答为什么在
开始
部分初始化变量或数组:
对于您的问题,为什么必须在
BEGIN
块中启动变量或数组,是因为读取输入文件时,
BEGIN
节在主块之前执行,所以最好将所有变量和数组的初始化都放在那里,以避免它们在有条件的情况下重新启动或启动(每次读取每一行时都会检查)这就是为什么建议在
BEGIN
部分初始化它们。

对于您在
BEGIN
部分使用
color
数组值的问题,这取决于您的要求,您想在何处使用它,因为您没有告诉我们样本输入和预期样本输出如此难以分辨,尽管启动了ar
BEGIN
部分中的光线应该很好,因此您无需在
awk
的主要部分中反复启动或创建光线。哦,我明白了!您需要一个用于主体块的输入文件!非常感谢您的清晰解释!
awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}
{print color["one"] }'