[英]why do I need to initialize variable in begin block
我已经运行了以下代码:
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"]
放在 body 块中作为第一个不工作的代码? 另外,为什么我必须放color["one"]="red"; color["two"]="orange";print color["one"]
color["one"]="red"; color["two"]="orange";print color["one"]
在 begin 块中color["one"]="red"; color["two"]="orange";print color["one"]
? 谢谢你。
是的,这是正常现象,因为BEGIN
在部分awk
读取INPUT_FILE所以它并不需要你这边过任何INPUT_FILE名的1日前执行awk
作品。 但是在您的另一个awk
您关闭了BEGIN
部分,然后通过{...}
打开了一个主块,因此它需要一个 Input_file 来执行它。
从man awk
页面也可以看到以下内容:
BEGIN 和 END 是两种特殊的模式,它们不针对输入进行测试。 所有 BEGIN 模式的动作部分都被合并,就好像所有语句都写在单个 BEGIN 块中一样。 它们在读取任何输入之前执行。 类似地,所有 END 块都被合并,并在所有输入都用完时(或在执行 exit 语句时)执行。 BEGIN 和 END 模式不能与模式表达式中的其他模式组合。 BEGIN 和 END 模式不能缺少动作部分。
你的第一个awk
:
awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'
在BEGIN
部分之后没有给出任何语句,所以它按预期工作并给出red
作为输出。
你的第二个awk
:让我们把它分成两部分
第一部分(理解):
awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}
第二部分(理解):
{print color["one"] }'
所以第一部分是BEGIN
部分,第二部分是主块,它期望将 Input_file 传递给awk
程序。
回答为什么在BEGIN
部分初始化变量或数组:对于您的问题,为什么必须在BEGIN
块中初始化变量或数组是因为在读取 Input_file 时BEGIN
部分在主块之前执行,因此最好对所有变量进行初始化和数组,以避免它们重新启动或使用条件启动它们(每次读取每行时都会检查)。 这就是为什么建议恕我直言在BEGIN
部分初始化它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.