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.

mormaii2
quelle
stackoverflow.com/questions/9894986/… || löschen: superuser.com/questions/396536/…
Ciro Santilli 法轮功 病毒 审查. 事件 法轮功

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.

Steeldriver
quelle
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
jimmij
quelle
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,