私はほぼ似たようなファイルを持っています
header_one
param1
param2
...
data_one
data1
data2
data3
data4
...
header_two
param1
param2
...
data_two
data1
data2
data3
data4
header
次の行があるすべてのブロックと次の行があるすべてのブロックを抽出してファイルに表示される順序を維持し、他のすべてのブロックを削除したいと思います。N
data
M != 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_
答え2
以下のsedコマンドを試してみて、うまくいくかどうかをテストしました。混乱した点があれば教えてください。
sed -n -e '/header_/,+1p' -e '/^data_/,+2p' filename
出力
header_one
param1
data_one
data1
data2
header_two
param1
data_two
data1
data2