大量のデータでいっぱいのテキストファイルがあります。特定の文字列を含む行を抽出する必要があります。私は次のようにawkを介してこれを行いました。
awk '/pattern1|pattern2|pattern3/ {print;}' infile
次に、3行目の後に新しい行(\ n)を追加する必要があります。だから、次のようにする必要があります
pattern1
pattern2
pattern3
<new line>
pattern1...
最初のコマンドを別のawkステートメントに渡すことでこれを行うことができました。
awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }'
私はこれを行うためのより効率的な方法が必要だと思い、これら2つのコマンドを組み合わせる方法を探し始めました。私は以下を試しました:
awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }'
これがうまくいくと思いましたが、出力は完全に予測できません。場合によっては、5つの行が2つのグループにグループ化されますが、3つ以外のグループがある場合があります。
区切り文字の問題がある可能性があると考えて、-Fオプションを使用してIFSを設定してみましたが、出力は変更されませんでした。
if文とパターンマッチングを組み合わせようとすると何か愚かなことをしているようですが、組み合わせがわかりません。
単一のawkコマンドで達成したいことは可能ですか?それで、私はどこで間違っていますか?
答え1
試した解決策の問題は、awkがNR
適切ではないことです。入力するレコード数に応じて改行を挿入しようとしています。出力記録。
私はawk自体がそのような数を維持するとは思いませんが、次のようなことをすることができます。
awk '/pattern1|pattern2|pattern3/ {print; if (++onr%3 == 0) print ""; }' infile
ここで新しい変数を定義しますonr
(出力レコード数- 変数名は任意です)目的のテキストを一致/印刷するたびに増やしてから、次の点を確認してください。それ3 に分割すると改行文字が印刷されます。
答え2
私は正しく理解していますか?あなたは発明を試しています。
awk '/pattern1|pattern2/ {print $1;} /pattern3/ {print $1 "\n"}' infile