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