Löschen Sie jede n-te Zeile in der Shell


8

Ich versuche, eine Zeile nach N Zeilen mit awk zu löschen, und ich kann es scheinbar nicht richtig machen. Das Dateiformat ist wie folgt

YYYYYY
XXXXXX
XXXXXX
YYYYYY
XXXXXX
XXXXXX

Das wahre Beispiel wäre

office3
3
1
office3
6
1
office3
6
3
office3
1
1

Wie kann ich die YY-Zeilen oder die Zeilen mit der Aufschrift "office" löschen? Ich muss alle zwei Zeilen eine Zeile löschen, unabhängig von deren Inhalt.


Antworten:


13

Wenn Sie GNU sed haben, können Sie die Adressnotation n~m( nüberspringen m) verwenden

sed '1~3d' file

Dadurch wird jede dritte Zeile ab der ersten gelöscht.


Das hat es für mich gelöst. Ich wusste nicht über diese sed Funktion. Vielen Dank!
— mormaii2

10

Um nur Zeilen modulo Nmit awktry auszuwählen

awk '!(NR%2)' file

oder

awk 'NR%3==0' file

Hier NRbezeichnet die Anzahl der bisher verarbeiteten Zeilen.


In Ihrem speziellen Fall (entfernen Sie alle Zeilen mit Y):

$ echo 'YYYYYY
XXXXXX
XXXXXX
YYYYYY
XXXXXX
XXXXXX' | awk '!(NR%3==1)'
XXXXXX
XXXXXX
XXXXXX
XXXXXX

In diesem Beispiel wollen wir die Zeilen 1 und 4 löschen, alsoNR%3==1
— Glenn Jackman

4
Diese Lösung hat den Vorteil, dass sie Standard und portabel für alle POSIX-Systeme ist (auch für Systeme vor POSIX, da sie bis auf das erste im Original awkvon 1979 funktioniert )
— Stéphane Chazelas,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.