GNU/Linux >> Tutoriales Linux >  >> Linux

¿Mantener solo la primera línea de cada secuencia de líneas consecutivas que coincidan con un patrón?

Si 2 o más líneas consecutivas contienen un patrón específico, elimine todas las líneas coincidentes y conserve solo la primera línea.

En el siguiente ejemplo, cuando 2 o más líneas consecutivas contienen "IO lógico", debemos eliminar todas las líneas coincidentes pero mantener la primera línea.

Archivo de entrada:

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

Archivo de salida:

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

Respuesta aceptada:

Usando awk :

awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
  • /logical IO/ {if (!seen) {print; seen=1}; next} comprueba si la línea contiene logical IO , si se encuentra y la variable seen es falso, es decir, la línea anterior no contiene logical IO , luego imprima la línea, configure seen=1 y vaya a la siguiente línea; de lo contrario, vaya a la siguiente línea ya que la línea anterior tiene logical IO

  • Para cualquier otra línea, {print; seen=0} , imprime la línea y los conjuntos seen=0

Ejemplo:

$ 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. ¿Devolver solo la parte de una línea después de un patrón coincidente?

  2. ¿Reemplazar líneas que coinciden con un patrón con líneas de otro archivo en orden?

  3. ¿Encontrar solo la primera aparición usando solo Grep?

  4. ¿Cómo recuperar solo la línea necesaria de la salida del terminal?

  5. ^M al final de cada línea en vim

¿Cómo hacer un diagrama gráfico de una secuencia de números a partir de la entrada estándar?

¿Eliminar líneas consecutivas en Csv con valores duplicados en un campo, pero conservar la última línea?

¿Cómo dividir un archivo y mantener la primera línea en cada una de las piezas?

Omitir la primera línea de cualquier salida de comando de Linux

sed para insertar solo en la primera coincidencia

Linux:grep desde ciertas líneas hasta el final del archivo