awk forループで文字列を連結してEND部分で印刷する方法

awk forループで文字列を連結してEND部分で印刷する方法

質問: "「ENDセクションで印刷された変数には、すべての行ではなく最後に見つかった行だけがあります。

ファイル1:

pattern .........
irrelevant text
irrelevant text
pattern .........
pattern .........
irrelevant text

奇妙なコード:

awk '{ for (i=1; i<=NR; i++)
       if ($i ~ /^pattern/) a+=$0 
     }
     END {print $a}' file1

END部分でパターンのある行だけを印刷したいと思います。

ベストアンサー1

特定のパターンに一致するすべての行を収集し、最後に印刷したいようです。

あなたはこれを行うことができます

awk '/^pattern/ { a[++n] = $0 }
     END { for (i = 1; i <= n; ++i) print a[i] }' file

これはa配列として機能し、パターンに一致する各行を配列の新しい項目として追加します。最後に繰り返された項目を繰り返し、a各項目を印刷します。

pattern行全体の正規表現を一致させるのではなく、最初の列で正しいリテラル文字列を見つけるには、$1 == "pattern"as条件を使用します。

しかし、これがみんなやりたいことをすれば使いやすくなります

awk '/^pattern/' file

patternまたは、最初の列のリテラル文字列と一致させたい場合

awk '$1 == "pattern"' file

これにより、パターンに一致する各行の基本操作が呼び出されます。pattern2番目のバリアントを使用する場合は、それを最初の列として含めます。 「デフォルト動作」は行を印刷することです。


では、現在行の値を増加させるawk算術演算となり、a += $0数値として解釈されます。alineを文字列として変数に連結するには、または追加された文字列の前に改行文字を挿入する場合(デフォルト)をa使用できます。しかし、私は何もここでやりたいことではないと思います。a = a $0a = a ORS $0ORS

おすすめ記事