如果我在 AWK 的 END 块中不写“if”,为什么会出现语法错误?

如果我在 AWK 的 END 块中不写“if”,为什么会出现语法错误?

这几天我正在学习 AWK 进行文本处理。但我对 AWK 语法非常困惑。我在维基百科上读到语法遵循以下格式:

(conditions) {actions}

我假设我可以在 BEGIN 和 END 块中遵循相同的语法。但是当我运行以下脚本时出现语法错误。

awk 'BEGIN{}
(1 == 1) {print "hello";}
END{
(1==1) {print "ended"}}' $1

但是,如果我在 END 块内进行一些更改并在条件之前添加“if”,则它运行得很好。

awk 'BEGIN{}
(1 == 1) {print "hello";}
END{
if (1==1) {print "ended"}}' $1

为什么END块中必须写“if”,而普通块中不需要?

答案1

AWK 程序是一系列规则,也可能是函数。规则被定义为图案(conditions)以您的格式),然后是行动;两者都是可选的。

BEGINEND特殊图案

因此在

BEGIN {}
(1 == 1) { print "hello"; }
END { if (1 == 1) { print "ended" } }

模式是BEGIN, (1 == 1)(括号不是必需的)和END

模式后面的大括号内的块(或没有模式,以匹配所有内容)是行动。你不能这样编写模式里面一个块,每个块都由引入它的模式控制。操作内的条件必须指定为if语句(或其他条件语句while等)的一部分。

上面的动作是{}(空动作)、{ print "hello"; }、 和{ if (1 == 1) { print "ended" } }

由以下内容组成的块会导致{ (1 == 1) { print "ended" } }语法错误,因为(1 == 1)这里是一个语句,并且必须以某种方式与后面的语句分开;{ 1 == 1; { print "ended" } }将是有效的,但不会达到您想要的效果 -1 == 1将被评估,然后单独,{ print "ended" }.

答案2

引用(英文)维基百科 - AWK 程序的结构

AWK 程序是一系列模式动作对,写为:

condition { action }
condition { action }
...

其中条件通常是一个表达式,而操作是一系列命令。

文章没有提到的是,条件或模式是可选的。这意味着在您的情况下(1 == 1)不需要,因为这始终是正确的。


重写片段产生

BEGIN {}
{ print "hello"; }
END { print "ended"; }

并且有一个空的动作,你可以完全跳过这行

{ print "hello"; }
END { print "ended"; }

另请注意,在示例中

END {(1 == 1) { print "ended"; }}

模式/条件是END且不是(1 == 1)1 == 1是在动作之内,也是动作的一部分。这也是出现错误的原因。

相关内容