2017-02-10 4 views
2

Beispieltext gefolgt Spiele:sed, awk oder ähnlich - löscht ganze Linie und 2 Zeilen oben, wenn Muster durch eine Leerzeile

heading1 
heading2 
data 
data 
data 

heading1 
heading2 

heading1 
heading2 
data 
data 
data 

ich den Abschnitt in der Mitte gelöscht werden soll, die keine Daten enthalten . Das ist; Wenn Überschrift2 von einer leeren Zeile gefolgt wird, löschen Sie heading2, heading1 und die leere Zeile darüber.

Ich habe gefunden, wie Sie Zeilen entfernen, nur gefolgt von einer leeren Zeile, und wie Sie n Zeilen über/unter einem Muster löschen, aber nicht herausfinden, wie Sie die beiden zusammenführen.

Danke.

Antwort

8

können Sie awk verwenden:

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

Während awk standardmäßig auf einer Basis pro Zeile arbeitet, Aufzeichnungen nicht notwendigerweise eine einzelne Zeile sein müssen. Mit RS (der Eingang Datensatz Trennzeichen) können Sie definieren, wie Datensätze getrennt sind.

Ich setze RS im Block BEGIN auf eine leere Zeile, um Datensätze nach Absätzen zu trennen und FS zu Newline, um Felder durch einen Zeilenumbruch zu trennen.

NF holds ist die Anzahl der Felder im aktuellen Datensatz. NF>2 prüft auf jeden Datensatz, der mehr als 2 Zeilen enthält - und wenn diese Bedingung erfüllt ist, druckt awk den Datensatz.

ORS ist die Ausgabe Datensatz Trennzeichen. Ich setze es auf eine Leerzeile, wie FS, um einzelne Datensätze in der Ausgabe zu trennen.

+0

OK, das scheint zu funktionieren. Vielen Dank. Ich werde es am Montag gründlicher testen (es ist Heimzeit, und das ist arbeitsbezogen). Kannst du bitte erklären, was jeder Teil macht? – Darren

+0

@Inian Was ist unklar? – hek2mgl

+0

@ hek2mgl: Versuche jetzt eine Idee zu bekommen, '++' für Innovation! – Inian

2

Hier ist ein ähnlicher Ansatz, der dem Druck der letzten leeren Zeile beseitigen:

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

Nice one ....... – hek2mgl

+0

Konnte nicht dieses zum Funktionieren bringen. – Darren

1

Dies könnte für Sie arbeiten (GNU sed): durch eine leere Zeile

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

Shop Aufzeichnungen begrenzt, im Musterraum. Wenn ein Datensatz 3 oder mehr Zeilenumbrüche enthält, löschen Sie ihn.

Verwandte Themen