2017-02-10 5 views
2

サンプルテキストが続く行全体とパターンが一致した場合は、上記の2行を削除します。私はすべてのデータを持っていない途中でセクションを削除するのsed、awkのまたは類似 - 空白行

heading1 
heading2 
data 
data 
data 

heading1 
heading2 

heading1 
heading2 
data 
data 
data 

。あれは; heading2の後に空白行がある場合は、上のheading2、heading1、および空白行を削除します。

空白行が続くときにのみ行を削除する方法と、パターンの上/下のn行を削除する方法を見つけましたが、その2つをマージする方法はありません。

ありがとうございました。

答えて

8

あなたはawkを使用することができます。

awk 'BEGIN{RS=ORS="\n\n";FS="\n"} NF>2' input.file 

デフォルトでawkは行ごとに動作しますが、記録は必ずしも単一の行である必要はありません。 RS入力レコードセパレータ)を使用すると、レコードがどのように区切られるかを定義できます。

BEGINブロック内のRSブロックを、段落でレコードを区切る空白行に設定し、改行でFS改行を区切りフィールドに区切ります。

NF holdは、現在のレコードのフィールド数です。 NF>2は2行以上のレコードをチェックし、この条件が満たされている場合はawkがレコードを出力します。

ORSは、出力レコードセパレータです。私は出力の個々のレコードを分離するために、FSのように空行に設定しています。 、空行で区切ら

sed ':a;N;/^$/M!ba;s/\n/&/3;t;d' file 

ストアレコード:

awk -v RS= 'NF>2{print sep $0; sep=ORS}' file 
+0

OK、これはうまくいくようです。ありがとう。私は月曜日にそれをもっと徹底的にテストします(ホームタイムで、これは仕事に関連しています)。あなたはそれぞれの部分が何をしているか説明できますか? – Darren

+0

@Inian不明な点は何ですか? – hek2mgl

+0

@ hek2mgl:今すぐアイデアを得ようとすると、革新のために「++」! – Inian

2

はここで同様の最後に空の行を印刷排除するアプローチでありますパターン空間で。レコードに3つ以上の改行が含まれている場合は、それを削除します。

+0

ニースone ....... – hek2mgl

+0

これを動作させることができませんでした。 – Darren

1

これはあなたのために働くかもしれない(GNU SED):