5 votes

Comment imprimer un séparateur si une valeur ou deux lignes consécutives ne correspondent pas à une colonne ?

J'ai une entrée comme la suivante et je dois mettre un séparateur entre les lignes si la valeur de la troisième colonne entre deux lignes est différente.

one two three four
five six three seven
eight nine ten elevel
alpha beta ten gama
tango charlie oscar bla

Résultat escompté :

one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

Voici ce que je pensais être efficace, mais ce n'est pas le cas.

awk '{col3=$3;next} $3!=col3{$0="\n="$0;print $0}' input

9voto

James Brown Points 17362
$ awk '$3!=p && NR>1 { print "=" } { print; p=$3 }' file
one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

5voto

Inian Points 36223

Une autre variante dans Awk complétant La réponse de James (ou juste la même chose ? écrite différemment),

awk '{ if ($3 != old && NR>1) { print "=" } print; old = $3; }' file

L'idée est essentiellement de sauvegarder le $3 de chaque ligne et, en principe, si elle varie dans la suivante, imprimez la chaîne nécessaire. Le site NR>1 est juste une condition pour sauter l'impression de la première ligne.

5voto

Akshay Hegde Points 12930
$ awk 'p!=$3{if(NR>1)print "="; p=$3}1' file 
one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

4voto

RavinderSingh13 Points 29608

Suivant awk peut vous aider aussi dans le même sens.

Solution 1 : Avec des conditions vérifiant et ayant prev dans celui-ci :

awk 'prev!=$3 && prev{print "="} 1; {prev=$3}'  Input_file

Solution 2 : avec l'utilisation de printf et en vérifiant les conditions.

awk '{printf("%s%s",prev!=$3 && prev?"=" RS $0:$0,RS);prev=$3}' Input_file

2voto

Guy Points 552

Je vais ajouter que le problème avec votre solution initiale était le suivant :

{
  col3=$3;
  next;
}

Comme il s'agit de la première action, pour chaque ligne, la variable col3 serait placé dans le champ 3, avant que le next mot-clé permettrait de sauter la deuxième action pour toutes les lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X