Bonjour,
j'ai récupéré cette ligne de commande awk:
mais je ne comprends pas le début :oops:Code:awk '{!a[$1]++} END {for(i in a) if ( a[i] >10 ) print a[i],i }' fichier
Quelqu'un pourrait-il m'expliquer:
Merci.Code:!a[$1]++
Version imprimable
Bonjour,
j'ai récupéré cette ligne de commande awk:
mais je ne comprends pas le début :oops:Code:awk '{!a[$1]++} END {for(i in a) if ( a[i] >10 ) print a[i],i }' fichier
Quelqu'un pourrait-il m'expliquer:
Merci.Code:!a[$1]++
Bonjour,
si a[$1] n'existe pas
alors l'incrémenter.
Merci pour ta réponse rapide! Hélas pour moi , cela s'obscurcit, désolé. :oops:
J'essaie d'appliquer cette commande sur un fichier access_log pour compter le nombre de fois où chaque ip est enregistrée.
Cette commande fait-elle cela:
- constitution d'un tableau de 2 colonnes (a et $1)?
- le traitement se faisant ligne à ligne, si la paire (a,$1) n'existe pas, on incrémente a de 1?
awk ne dispose pas de tableaux multidimensionnels.
a est le nom du tableau (array)
$1 est l'"index"
(c'est pas vraiment un index, puisque ce n'est jamais considéré comme un nombre, mais comme du texte; même quand, apparemment, c'est un nombre)
Désolé N_BaH, mais je ne crois pas...
Je ne comprends pas bien l'instruction, mais en faisant un essai, voici ce que j'observe:
Il me semble que le '!' s'applique après l'incrément (à vérifier). Et donc, il ne sert strictement à rien!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 $ cat plop abc def hello yyy bof abc again efg what def de nouveau abc encore $ $ awk '{!a[$1]++} END {for(i in a) if ( a[i] > 0 ) print a[i],i }' plop 2 def 1 efg 3 abc 1 yyy $ awk '{a[$1]++} END {for(i in a) if ( a[i] > 0 ) print a[i],i }' plop 2 def 1 efg 3 abc 1 yyy
En gros, a[$1] est un tableau associatif qui, pour le premier champ de chaque ligne, stocke un nombre qui est incrémenté à chaque fois que ce premier champ est de nouveau rencontré.
Soit, en bref (et comme on peut le constater dans l'exemple que j'ai fourni), cette commande compte le nombre d'occurrences du premier champ et imprime, dans leur ordre d'apparition, chaque premier champ différent précédé du nombre d'occurrences.
PS: dans le script original, on n'imprime que si le nombre d'occurrences est strictement supérieur à 10
Merci jack-ft.
Tu as devancé ma question suivante car j'ai testé aussi sans le "!" et les résultats étaient identiques.
Je crois que j'ai compris. Merci à vous deux. :ccool:
:oops: en effetCitation:
Envoyé par jack-ft
:koi:
par contre, le fait que les "indices" soient du texte, oblige certaines transformations (en interne), qui ne permettent pas de conserver l'ordre d'apparition.
quelques recherches plus tard...
EDIT :
le ! conditionne l'affichage :ceci n'affiche pas les lignes dont le premier champ est enregistré dans le tableau.Code:
1
2
3
4
5 awk '! a[$1]++' plop abc def hello yyy bof efg what