パターンマッチ1の直前に発生するパターンマッチ2を探す

パターンマッチ1の直前に発生するパターンマッチ2を探す

次のような他のパターンの前に表示するパターンが必要なファイルがあります。

PAT1  
coord  
data  
data  
PAT1  
coord  
data  
data  
data  
PAT1  
coord  
data  
PAT2  
PAT1  
coord  
...

PAT1ファイルには常に -> coord->ストリームがありますが、data必ずしもPAT2afterではありませんdata。希望の出力:coord- PAT2と直前のPAT1の間の出力。

つまり、予想される出力は次のようになります。

coord

与えられた例にはPAT2が1つしかないからです。

このサイトや他のサイトで多数の質問と回答を見ましたが、正確な内容が見つかりませんでした。たとえば、

すべてのPAT1にPAT2があればいいでしょう。
https://stackoverflow.com/questions/38972736/how-to-print-lines- Between-two-patterns-inclusive-or-exclusive-in-sed-awk-or/38972737#38972737

coordこの回答は、PAT2-に特定の行数がある場合に便利です。
awkは、他の一致前の最後のレコードである場合にのみ一致を印刷します。

など。

どんなアドバイスも本当にありがとうございます。私はどのような方法(sed、awk、grepなど)にも開いています。

ベストアンサー1

より代表的な入力例は、印刷する出力行を識別する行番号と同じである。

> nl file
     1  PAT1  
     2  coord  
     3  data  
     4  data  
     5  PAT1  
     6  coord  
     7  data  
     8  data  
     9  data  
    10  PAT1  
    11  coord  
    12  data  
    13  PAT2  
    14  PAT1  
    15  coord  

このコマンドは、との間にある場合にのみパターンを含む行を印刷し、awk両方のパターンはブロックに表示されません。coordPAT1PAT2

awk '/PAT1/{f=1; p=""} p && /PAT2/{print p; exit} f && /coord/{p=$0}' <(nl file)
    11  coord  

f一致するものがPAT1見つかったことを示すために使用され、このフラグはcoord後続の一致を有効にするために使用されます。p見つかった各コンテンツも消去されるPAT1ため、同様の状況では何も印刷されませんPAT1 coord PAT1 text PAT2

また、exit印刷後にさらに情報を探したい場合は、フラグをリセットして置き換えることができます。

おすすめ記事