IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Expliquer une commande awk de compteur


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Par défaut Expliquer une commande awk de compteur
    Bonjour,

    j'ai récupéré cette ligne de commande awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{!a[$1]++} END {for(i in a) if ( a[i] >10 ) print a[i],i }' fichier
    mais je ne comprends pas le début
    Quelqu'un pourrait-il m'expliquer:
    Merci.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Bonjour,

    si a[$1] n'existe pas
    alors l'incrémenter.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Par défaut
    Merci pour ta réponse rapide! Hélas pour moi , cela s'obscurcit, désolé.
    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?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    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)
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    si a[$1] n'existe pas
    alors l'incrémenter.
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Il me semble que le '!' s'applique après l'incrément (à vérifier). Et donc, il ne sert strictement à rien!

    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

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Par défaut
    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.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Citation Envoyé par jack-ft
    Désolé N_BaH, mais je ne crois pas...
    en effet


    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk '! a[$1]++' plop
    abc
    def hello
    yyy bof
    efg what
    ceci n'affiche pas les lignes dont le premier champ est enregistré dans le tableau.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Commande awk sur une requête SQL
    Par Msxty dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 22/09/2011, 16h46
  2. Limiter la portée d'une commande \ifthenelse et d'un compteur au sein d'une boite
    Par Théodulf dans le forum Programmation (La)TeX avancée
    Réponses: 7
    Dernier message: 18/04/2011, 23h11
  3. Awk sur une commande?
    Par Empty_body dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 03/06/2008, 08h34
  4. [awk] Récupérer une commande system dans un awk
    Par zebulon90 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 18/09/2007, 10h52
  5. Recheche commande AWK pour afficher une liste de fichiers
    Par Krispy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/07/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo