最近では、テキスト処理のために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
それは行動の中にあり、行動の一部です。これがエラーの原因でもあります。