Se 2 o più righe consecutive contengono uno schema specifico, elimina tutte le righe corrispondenti e mantieni solo la prima riga.
Nell'esempio seguente, quando 2 o più righe consecutive contengono "IO logico", è necessario eliminare tutte le righe corrispondenti ma mantenere la prima riga.
File di input:
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
File di output:
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
Risposta accettata:
Usando awk
:
awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt
-
/logical IO/ {if (!seen) {print; seen=1}; next}
controlla se la riga contienelogical IO
, se trovato e la variabileseen
è false, ovvero la riga precedente non contienelogical IO
, quindi stampa la riga, impostaseen=1
e vai alla riga successiva altrimenti vai alla riga successiva poiché la riga precedente halogical IO
-
Per qualsiasi altra riga,
{print; seen=0}
, stampa la riga e gli insiemiseen=0
Esempio:
$ 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