awkはいつ改行文字を ";"として扱いますか?

awkはいつ改行文字を

有名なawkチュートリアルを読んでいます。http://www.grymoire.com/Unix/Awk.html

言及したTo be precise, in the original AWK you can insert a new line character after the curly braces, and at the end of a command, but not elsewhere.

awkMacとリモートホストで複数行のawkコマンドを使用してフォローすることをテストしましたgawk

  awk '$0 !~ /special_signal/  \
       { my_dict[$1] += $2 }
       END { for (uid in my_dict)   \
             if (my_dict[uid] > 1)  \
             print uid, my_dict[uid]}' raw_data | sort -nk2

上記のawkコードの元の1行のawkコマンドは次のとおりです。

awk '$0 !~ /special_signal/ { my_dict[$1] += $2 } END { for (uid in my_dict) if (my_dict[uid] > 1) print uid, my_dict[uid]}' raw_data | sort -nk2

私の実験を通して。私はonと最初のものが必須であることを発見しましたawkgawkそれが\なければ、コードは元の1行コードとは異なる動作をします。改行の効果は次のとおりです。;

ただし、2つのawkバージョンのうち2番目と3番目のバージョンは必要ありません\for (uid in my_dict)if (my_dict[uid] > 1)

私はそれらを削除し、複数行のコードが1行のコードと同じように動作します。

その後、2番目と3番目を\置き換えたところ;、複数行のコードが誤った結果をもたらしました。

for (uid in my_dict)これは、次に改行を追加すると、if (my_dict[uid] > 1)2つのコードブロックが次のコード行に関連付けられることをさらに証明します\

私の結論はチュートリアルと衝突するようです。

では、実際にawkはどのような状況で改行文字を処理し、;どの状況でこれを処理しますか\


PS:テスト用にいくつかのテストコンテンツを作成しましたraw_data

Tom 2
Tom 5
Jack 3
Mary 5
special_signal 5
Tim 10
Don 22
Jan 3
Jack 8
special_signal 10

ベストアンサー1

例行の違いは次のとおりです。この時点でコマンドを完了できますか?パターンはそれ自体で存在できます{print}。次の行は2番目のコマンドと見なされます(最初のコマンドの2番目の部分ではありません)。このパターンは常に真と見なされます。

ただし、制御構造(for、、if)ではその時点でコマンドを完了できないため、コマンドが次の行から続くことは明らかです。

シェルコードでも同様です。

echo foo &&
echo bar

説明が違う

echo foo
&& echo bar

だからあなたは必要です

echo foo \
&& echo bar

これとは異なり、awk1つの方法しか機能しません。ただし、同様の状況がある可能性があります。

おすすめ記事