このコードを使用して、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スクリプト(中括弧の中の部分)が結果を印刷します。