GNU/Linux >> Tutoriels Linux >  >> Linux

Comment fonctionne Awk '!a[$0]++' ?

Cette ligne unique supprime les lignes en double de la saisie de texte sans pré-tri.

Par exemple :

$ cat >f
q
w
e
w
r
$ awk '!a[$0]++' <f
q
w
e
r
$ 

Le code original que j'ai trouvé sur Internet était le suivant :

awk '!_[$0]++'

C'était encore plus perplexe pour moi car j'ai pris _ avoir une signification particulière dans awk, comme en Perl, mais il s'est avéré que ce n'était qu'un nom de tableau.

Maintenant, je comprends la logique derrière le one-liner :
chaque ligne d'entrée est utilisée comme clé dans un tableau de hachage, ainsi, une fois terminé, le hachage contient des lignes uniques dans l'ordre d'arrivée.

Ce que j'aimerais savoir, c'est comment exactement cette notation est interprétée par awk. Par exemple. quel est le signe bang (! ) signifie et les autres éléments de cet extrait de code.

Comment ça marche ?

Réponse acceptée :

Voici une réponse "intuitive", pour une explication plus approfondie du mécanisme d'awk, voir @Cuonglm's

Dans ce cas, !a[$0]++ , le post-incrément ++ peut être mis de côté un instant, il ne change pas la valeur de l'expression. Alors, regardez seulement !a[$0] . Ici :

a[$0]

utilise la ligne courante $0 comme clé du tableau a , en prenant la valeur qui y est stockée. Si cette clé particulière n'a jamais été référencée auparavant, a[$0] évalue à la chaîne vide.

!a[$0]

Le ! annule la valeur d'avant. S'il était vide ou nul (faux), nous avons maintenant un vrai résultat. S'il était différent de zéro (vrai), nous avons un résultat faux. Si l'expression entière est évaluée à true, ce qui signifie que a[$0] n'était pas défini au départ, la ligne entière est imprimée comme action par défaut.

De plus, quelle que soit l'ancienne valeur, l'opérateur de post-incrémentation ajoute un à a[$0] , donc la prochaine fois que la même valeur dans le tableau sera accédée, elle sera positive et toute la condition échouera.


Linux
  1. Qu'est-ce qu'un Makefile et comment ça marche ?

  2. Qu'est-ce que le DNS et comment ça marche ?

  3. Comment ça marche ? Que fait rm ?

  4. Comment fonctionne sig_atomic_t ?

  5. Comment fonctionne l'interface de bouclage

Comment fonctionne Git ?

Comment fonctionne SFTP ?

Ssh – Comment fonctionne le tunneling Ssh inversé ?

Linux - Comment fonctionne l'affichage de Linux ?

Comment fonctionne la mémoire d'échange sous Linux ?

Comment fonctionne l'affichage de Linux ?