次のような他のパターンの前に表示するパターンが必要なファイルがあります。
PAT1
coord
data
data
PAT1
coord
data
data
data
PAT1
coord
data
PAT2
PAT1
coord
...
PAT1
ファイルには常に -> coord
->ストリームがありますが、data
必ずしもPAT2
afterではありません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
両方のパターンはブロックに表示されません。coord
PAT1
PAT2
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
印刷後にさらに情報を探したい場合は、フラグをリセットして置き換えることができます。