あるファイルから2つのパターンを収集し、一致するパターンに従って行を別の出力ファイルに送信するにはどうすればよいですか?

あるファイルから2つのパターンを収集し、一致するパターンに従って行を別の出力ファイルに送信するにはどうすればよいですか?

非常に大きなファイルから2つのパターンを検索していますが、何度もgrepを実行したくありません。現在、パターンを見つけるためにこのコマンドを実行しています。見つかったら、一致する行の前の行と後の2行もインポートし、sedを使用して行区切り文字を削除し、最後に出力を圧縮します。

zgrep -B 1 -A 2 'Pattern_1' In.gz | sed '/^--$/d' | gzip >out.gz

パターン1と2の両方を探して、私の行をそれぞれout1.gzまたはout2.gzとして印刷するにはどうすればよいですか?私は読んだこのスレッドしかし、私はawkに慣れていないので、私の場合でも動作するかどうかはわかりません。

ありがとう

答え1

あなたはできます:

zgrep -B1 -A2 'pat_1\|pat_2' In.gz | tee >(grep -B1 -A2 'pat_1' | \
  grep -v '^--$' | gzip >out1.gz) | grep -B1 -A2 'pat_2' | \
    grep -v '^--$' | gzip >pat_2.gz

ここで、tee初期出力は2つの方法で送信される。zgrep -B1 -A2 'pat_1\|pat_2' In.gz

  • プロセス置換コマンドは1つのモード()>()で機能します。pat_1

  • STDOUTに送信された出力は、次のパイプでキャプチャされ処理され、2番目のモード()の出力がgrep得られます。pat_2

関連情報