GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Nur die erste Zeile aus jeder Folge aufeinanderfolgender Zeilen beibehalten, die einem Muster entsprechen?

Wenn 2 oder mehr aufeinanderfolgende Zeilen ein bestimmtes Muster enthalten, löschen Sie alle übereinstimmenden Zeilen und behalten Sie nur die erste Zeile.

Wenn im folgenden Beispiel 2 oder mehr aufeinanderfolgende Zeilen „logical IO“ enthalten, müssen wir alle übereinstimmenden Zeilen löschen, aber die erste Zeile beibehalten.

Eingabedatei:

select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
handling logical IO 49
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
testing logical IO 12

Ausgabedatei:

select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346

Akzeptierte Antwort:

Mit awk :

awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
  • /logical IO/ {if (!seen) {print; seen=1}; next} prüft, ob die Zeile logical IO enthält , falls gefunden und die Variable seen ist falsch, d. h. die vorherige Zeile enthält kein logical IO , dann drucke die Zeile, setze seen=1 und gehe zur nächsten Zeile, sonst gehe zur nächsten Zeile, da die vorherige Zeile logical IO hat

  • Für jede andere Zeile {print; seen=0} , gibt die Zeile aus und setzt seen=0

Beispiel:

$ cat file.txt 
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
parsing logical IO 346
testing logical IO 12

$ awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346

Linux
  1. Nur den Teil einer Linie nach einem übereinstimmenden Muster zurückgeben?

  2. Wie zeigt man mit dem Linux-Befehl „cat“ nur bestimmte Zeilen nach Nummer an?

  3. Ersetzen Sie Linien, die einem Muster entsprechen, durch Linien aus einer anderen Datei in der richtigen Reihenfolge?

  4. Zusätzliche Kopfzeilen außer der ersten Zeile aus der Datei entfernen?

  5. Nur das erste Vorkommen nur mit Grep finden?

Wie erstelle ich ein grafisches Diagramm einer Folge von Zahlen aus der Standardeingabe?

Wie rufe ich nur die benötigte Zeile von der Terminalausgabe ab?

Wie teilt man eine Datei und behält die erste Zeile in jedem der Teile bei?

Wie kann ich Wörter zwischen den ersten beiden Instanzen von Text/Muster erhalten?

Linux - grep von bestimmten Zeilen bis zum Ende der Datei

Warum gibt slabtop -o nur die ersten 23 Zeilen zurück, wenn der Befehl weitergeleitet wird?