2017-02-10 37 views
2

示例文本:SED,AWK或類似 - 刪除整條生產線和2行以上,如果模式匹配之後是一個空行

heading1 
heading2 
data 
data 
data 

heading1 
heading2 

heading1 
heading2 
data 
data 
data 

我要刪除中間不具有任何數據段。那是;如果標題2後跟一個空行,則刪除標題2,標題1和上面的空白行。

我發現如何刪除行後只有一個空行,以及如何刪除模式上方/下方的n行,但不能解決如何合併這兩個。

謝謝。

回答

8

您可以使用awk

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

雖然awk默認情況下在每行的基礎上運行,記錄不一定需要是一個單一的線。使用RS輸入記錄分隔符),您可以定義如何分隔記錄

我在BEGIN塊設置RS一個空行的段落分開記錄和FS爲換行符一個新行分離領域。

NF保留數是當前記錄中的字段數。 NF>2檢查包含多於2行的任何記錄 - 如果滿足此條件,則awk將打印該記錄。

ORS輸出記錄分隔符。我將它設置爲空行,作爲FS,以便將輸出中的單個記錄分開。

+0

好的,這似乎工作。謝謝。我會在週一更徹底地測試它(這是家庭時間,這是與工作有關的)。你能解釋一下每個部件的功能嗎? – Darren

+0

@Inian什麼不清楚? – hek2mgl

+0

@ hek2mgl:現在試着想出一個主意,'++'爲了創新! – Inian

2

下面是一個類似的方法,將消除打印最後的空行:

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

不錯的一個....... – hek2mgl

+0

不能讓這個工作。 – Darren

1

這可能會爲你工作(GNU SED):

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

存儲記錄由一個空行分隔,在模式空間。如果記錄包含3個或更多換行符,則打印它,否則將其刪除。

相關問題