Pokud 2 nebo více po sobě jdoucích řádků obsahuje určitý vzor, odstraňte všechny odpovídající řádky a ponechte si pouze první řádek.
V níže uvedeném příkladu, když 2 nebo více po sobě jdoucích řádků obsahuje „logické IO“, musíme odstranit všechny odpovídající řádky, ale ponechat první řádek.
Vstupní soubor:
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
Výstupní soubor:
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
Přijatá odpověď:
Pomocí awk
:
awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt
-
/logical IO/ {if (!seen) {print; seen=1}; next}
zkontroluje, zda řádek obsahujelogical IO
, pokud je nalezen, a proměnnáseen
je false, tj. předchozí řádek neobsahujelogical IO
, vytiskněte řádek a nastavteseen=1
a přejděte na další řádek, jinak přejděte na další řádek, protože předchozí řádek málogical IO
-
Pro jakýkoli jiný řádek
{print; seen=0}
, vytiskne řádek a sadyseen=0
Příklad:
$ 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