有名な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.
awk
Macとリモートホストで複数行の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と最初のものが必須であることを発見しましたawk
。gawk
それが\
なければ、コードは元の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
これとは異なり、awk
1つの方法しか機能しません。ただし、同様の状況がある可能性があります。