awkステートメントの説明

awkステートメントの説明

このコードを使用して、20行ごとに新しい列を開始し、各列はタブで区切られます。この投稿のコードを取得して少し修正しました。n行目ごとに新しい列を開始する方法は?

awk '{a[NR%20] = a[NR%20] (NR<=20 ? "" : "\t") $0} END {for (i = 1; i <= 20; i++) print a[i%20]}' 

私が望むように正確に動作します。しかし、私はそれがどのように機能するのかよく理解していません。誰かが私にこれを説明できますか?$0ファイルのレコード全体(行)を読み、疑問符の前の条件を評価し、trueの場合は最初のステートメントを実行し、falseの場合は2番目のステートメントを実行することを知っています。したがって、この場合はNR<=20最初の列にあるため何も印刷されませんが、NR>20新しい列を開始するためにタブが印刷されます。また、forループはa[1%20]isで始まり、is、最後にisa[1]で配列の要素を印刷することも知っています。しかし、それは何をしますか?なぜそれと同じように設定されていますか?省略すると、20本の空白行が印刷されることがわかりました。a[19%20]a[19]a[20%20]a[0]a[NR%20] = a[NR%20]a[NR%20] = a[NR%20]

答え1

では、awkスペースで区切られた式が連結されます。この接続については、POSIX awk のマニュアルに記載されています。式テーブル(該当ページの形式はあまり明確ではないため、読みやすくなりますman 1p awk)。現在値+/+現在のレコードにa[NR%20]関連付けられています。最初の20レコードの場合、配列値と三項式は両方とも空の文字列になります。括弧を使用すると、より明確になります。"""\t"?:

a[NR%n] = (a[NR%n] (NR<=n ? "" : "\t") $0)

答え2

(NR<=20 ? "" : "\t")2番目の項目は変更中なので、それa[20%20]自体と同じに設定されていませんが、NR> 20の場合はテーブルが追加されます。

その後、ENDスクリプト(中括弧の中の部分)が結果を印刷します。

関連情報