GNU/Linux >> Tutoriels Linux >  >> Linux

Conserver uniquement la première ligne de chaque séquence de lignes consécutives correspondant à un motif ?

Si 2 lignes consécutives ou plus contiennent un motif spécifique, supprimez toutes les lignes correspondantes et ne conservez que la première ligne.

Dans l'exemple ci-dessous, lorsque 2 lignes consécutives ou plus contiennent des "E/S logiques", nous devons supprimer toutes les lignes correspondantes mais conserver la première ligne.

Fichier d'entrée :

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

Fichier de sortie :

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

Réponse acceptée :

Utiliser awk :

awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt 
  • /logical IO/ {if (!seen) {print; seen=1}; next} vérifie si la ligne contient logical IO , si trouvé et la variable seen est faux, c'est-à-dire que la ligne précédente ne contient pas logical IO , puis imprimez la ligne, définissez seen=1 et passez à la ligne suivante sinon passez à la ligne suivante car la ligne précédente a logical IO

  • Pour toute autre ligne, {print; seen=0} , imprime la ligne et les ensembles seen=0

Exemple :

$ 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. Supprimer efficacement les premières lignes d'un fichier texte ?

  2. Supprimer les lignes d'en-tête supplémentaires du fichier, à l'exception de la première ligne ?

  3. Supprimer des lignes consécutives dans Csv avec des valeurs en double dans un champ, mais conserver la dernière ligne ?

  4. Comment récupérer uniquement la ligne nécessaire à partir de la sortie du terminal ?

  5. ^M à la fin de chaque ligne dans vim

Comment faire un tracé graphique d'une séquence de nombres à partir de l'entrée standard ?

Comment scinder un fichier et conserver la première ligne dans chacun des morceaux ?

Omettre la première ligne de toute sortie de commande Linux

sed à insérer lors de la première correspondance uniquement

Comment puis-je obtenir des mots entre les deux premières instances de texte/motif ?

Comment différencier uniquement la première ligne de deux fichiers?