这几天我正在学习 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)
以您的格式),然后是行动;两者都是可选的。
BEGIN
和END
是特殊图案。
因此在
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
是在动作之内,也是动作的一部分。这也是出现错误的原因。