AWKのENDブロックに「if」を書かないと構文エラーが発生するのはなぜですか?

AWKのENDブロックに「if」を書かないと構文エラーが発生するのはなぜですか?

最近では、テキスト処理のためにAWKを学んでいます。しかし、私はAWK構文について非常に混乱しています。 Wikipediaでは、構文が次の形式に従うことを読みました。

(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

なぜ「if」をENDブロックに書き込むのですか?

答え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

見積(英語)Wikipedia - 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それは行動の中にあり、行動の一部です。これがエラーの原因でもあります。

関連情報