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 IOenthält , falls gefunden und die Variableseenist falsch, d. h. die vorherige Zeile enthält keinlogical IO, dann drucke die Zeile, setzeseen=1und gehe zur nächsten Zeile, sonst gehe zur nächsten Zeile, da die vorherige Zeilelogical IOhat -
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