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 Zeilelogical IO
enthält , falls gefunden und die Variableseen
ist falsch, d. h. die vorherige Zeile enthält keinlogical IO
, dann drucke die Zeile, setzeseen=1
und gehe zur nächsten Zeile, sonst gehe zur nächsten Zeile, da die vorherige Zeilelogical IO
hat -
Für jede andere Zeile
{print; seen=0}
, gibt die Zeile aus und setztseen=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