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" }

おすすめ記事