awk は 2 つのパターンに一致する行を抽出し、どちらも真です。

awk は 2 つのパターンに一致する行を抽出し、どちらも真です。

次の条件と一致しますが、両方の条件がtrueの場合にのみ行を印刷するように、以下のコードをどのように変更できますか?

抽出する必要がある行は、次の基準を満たす必要があります。
つまり、パターンb条件を満たす行が見つかると、パターンaと一致する行のみが印刷されます。

awk '/patterna/ || /patternb/ { print > "patternapatternb.txt" }' inputfile

入力ファイル
モードaこの
モードb対応
モードa
異なる
モード
モードa異なるこの
モードb異なるモード

出力パターンapatternb.txt:
パターンaこの
パターンbその
パターンa別のこのパターンnb
別のパターン

各ペアの出力を異なるファイルに書き込むことができるように、マルチペアモードでこれを実装する方法

答え1

awk各レコードを別々に処理します(デフォルトではレコードは行です)。隣接する行に条件を適用するには、この関数をgetline使用して次のレコードを読み取り、2番目のパターンについてテストできます。

awk '/patterna/ { 
  a=$0
  if (getline > 0 && $0 ~ /patternb/) {
    print a
    print
  }
}' inputfile

あるいは、以下を使用することを検討することができます。sed

sed -n '/patterna/ {$!N; /\npatternb/p}' inputfile

/patternb/一致するたびに最初の一致を印刷するには、前にを入力して次のようにします。/patterna//patterna/状態を保存パーサーは、一致する項目ごとにフラグを設定し、一致する項目ごとにフラグを設定解除すること/patterna/によってこれを行います/patternb/

awk '
  /patterna/ {
    a=1; lasta=$0; next;
  } 
  /patternb/ && a==1 {
     a=0; print lasta; print;
  }' inputfile

答え2

非常にクリーンなソリューションを使用していますTxR、出力以外の明示的な状態操作や副作用はありません。

@(repeat)
patterna @this
@  (repeat)
patterna @other
@    (fail)
@  (last :mandatory)
patternb @that
@  (end)
@  (output)
patterna @this
patternb @that
@  (end)
@(end)

ランニング:

$ txr pairs.txr data
patterna this
patternb that
patterna anotherthis
patternb anotherthat

このソリューションでは、次の要件をキャッチしようとします。patternbwith行の後ろでキーワードを見つけてくださいpatterna。すぐ後ろに減らす必要はありません。ただし、patternbこれは次の行の前に発生する必要があります。patterna指定されたpatterna行とその行と一致するペアの間にpatternb他の行を含めることはできませんpatterna

内部反復:

@  (repeat)
patterna @other
@    (fail)
@  (last :mandatory)
patternb @that
@  (end)

入力をスキャンして、次の2つの項目を見つけます。マッチ

patterna @other

または強制マッチングの終了

patternb @that

ただし、patterna @other見つかった場合は、次のコマンドがすぐに実行されると繰り返し失敗@(fail)します。 (繰り返しすると、暗黙のブロックが構築され、@(block)最も@(fail)内側を囲むブロックが一致失敗で終了します。)

答え3

さて、より包括的な説明に基づいてpcregrepを使用することができます

pcregrep -M 'patterna(.*\n)patternb' inputfile > patternapatternb.txt

この一行の内容はあなたに与えるでしょう

cat patternapatternb.txt
patterna this
patternb that
patterna another this
patternb another that

以前の回答

この1行のコードを使用しました...

 awk '/patterna/ && /patternb/ {print > "patternapatterb.txt" } ' inputfile

この入力ファイル

cat inputfile
patterna    patternb    this
patterna    patterna    that

明らかにする

cat patternapatterb.txt
patterna    patternb    this

これがまさにあなたが要求した内容のようです(あなたが「しかし両方とも本当の場合にのみ」と言われました)。ただし、お客様のリクエストを誤って理解した場合はお知らせください。

パターンaまたはパターンbと一致させるには、egrepを使用できます。

 egrep "patterna||patternb" inputfile > patternapatternb.txt

関連情報