さまざまなコンテキストで複数のパターンをgrep

さまざまなコンテキストで複数のパターンをgrep

私はほぼ似たようなファイルを持っています

header_one
param1
param2
...

data_one
data1
data2
data3
data4
...

header_two
param1
param2
...

data_two
data1
data2
data3
data4

header次の行があるすべてのブロックと次の行があるすべてのブロックを抽出してファイルに表示される順序を維持し、他のすべてのブロックを削除したいと思います。NdataM != N

M == N == 8私がこれを行うことができれば

grep -A8 -E "header_|data_"

しかし、各パターンに異なるコンテキストを提供するにはどうすればよいですか?

ベストアンサー1

awkを使用する一時的な解決策は次のとおりです。

awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file

n一致する行に対して設定され、各行に対して減少します。正の場合、n各ブロックの後に区切り文字が追加された行が印刷されます。上記の値を使用すると、header_1行に次の行を追加し、data_1行に次の行を2行ずつ印刷します。


コンテキストブロックが重複する可能性がある場合、新しい値はn古い値を上書きします。これを防ぐには、割り当てを保護する条件を追加してください。

awk '/^header_/ {if (n < 2) n=2} 
     /^data_/   {if (n < 5) n=5}
     n-- > 0; n == 0 {print "---"}' < file

これはdata_、連続した行に合計が存在する場合をよりよく処理する必要があります。header_

おすすめ記事