GNU/Linux >> Linux Esercitazione >  >> Linux

Mantenere solo la prima riga da ogni sequenza di righe consecutive che corrispondono a uno schema?

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 contiene logical IO , se trovato e la variabile seen è false, ovvero la riga precedente non contiene logical IO , quindi stampa la riga, imposta seen=1 e vai alla riga successiva altrimenti vai alla riga successiva poiché la riga precedente ha logical IO

  • Per qualsiasi altra riga, {print; seen=0} , stampa la riga e gli insiemi seen=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

Linux
  1. Trova solo la prima occasione usando solo Grep?

  2. Come recuperare solo la linea necessaria dall'uscita del terminale?

  3. ^M alla fine di ogni riga in vim

  4. ottenere i primi 5 caratteri da ogni riga nello script di shell

  5. Come posso ottenere parole tra le prime due istanze di testo/modello?

Rimuovere in modo efficiente le prime due righe da un file di testo?

Come creare un grafico grafico di una sequenza di numeri dall'input standard?

sed da inserire solo alla prima corrispondenza

Come differenziare solo la prima riga di due file?

Linux:grep da determinate righe alla fine del file

Perché slabtop -o restituisce solo le prime 23 righe quando il comando viene reindirizzato?