次の条件と一致しますが、両方の条件が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
このソリューションでは、次の要件をキャッチしようとします。patternb
with行の後ろでキーワードを見つけてください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