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.