Forum Linux.débutant Aide sur awk pour compter la longueur des mots...

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
12
mai
2015

Bonjour, Je suis tout nouveau ici sur ces forums, je me présente je suis étudiant (bref, de retour aux études après 20+ sur le marché du travail) et je fait présentement un cour sur la gestion et sécurité des réseaux.

Evidemment ce n'est pas chose aisé mais je me débrouille assez bien en général.

Bon, présentement je travaille à approfondir mes connaissances qui sont très de base sur AWK (dans CentOS 6.6 si ca peut changer quelque chose) et j'essaie d'établir dans un petit programme awk une facon de faire les choses suivantes:

Dans un très long fichier, compter la longueur de lettres de tout les mots qu'il contient (il y en a un par ligne apres que je l'ai nettoyé) et afficher le résultat de la facon suivante (ou similaire)

Longueur---------NBRE de mots
4 203
5 300
6 460
7 640

etc

J'ai fait plusieurs ébauches en utilisant print length($0)) mais je n'arrive pas a faire comptabiliser et afficher comme ci haut.

je demarre mon script comme cela
awk -f monfichier.awk fichier_a_analyser.txt

Merci à l'avance.

  • # tuyaux

    Posté par  (site web personnel) . Évalué à 3.

    voir gestion des tableaux

    Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

  • # gestion des tableaux?

    Posté par  . Évalué à 1.

    Merci de la réponse mais pourriez vous m'indiquer où est cette gestion des tableaux? Je ne la trouve pas sur ces forums.

    J'ai réellement besoin d'un coup de main! Merci.

    • [^] # Re: gestion des tableaux?

      Posté par  (Mastodon) . Évalué à 2.

      je te propose le parcours suivant, étape par étape :

      • afficher la taille de chaque mot, par exemple pour "a bb cccc dd eeeeeee" afficher "1 2 4 2 7"
      • ensuite tu utilises un tableau "tailles" et tu incrémentes chaque "case" concernée à chaque fois que tu rencontres un mot de cette longueur
        • pour "a" => tailles[1]++
        • pour "bb" => tailles[2]++
        • pour "cccc" => tailles[4]++
        • pour "dd" => tailles[2]++
        • pour "eeeeee" => tailles[7]++
      • pour finir, il te suffit de parcourir ton tableau "tailles" pour faire l'affichage du résultat
        • taille[1] => 1 mot
        • taille[2] => 2 mots
        • taille[3] => 0 mots
        • taille[4] => 1 mots
        • taille[5] => 0 mots
        • taille[6] => 0 mots
        • taille[7] => 1 mots

      voilà, je ne connais pas plus que ça AWK, mais je pense que tu dois pouvoir implémenter ça à pas très cher :)

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # integrer sort et uniq dans awk?

    Posté par  . Évalué à 1.

    En fait c'est que j'essaie d'integrer sort -n et uniq -c dans awk mais ca semble impossible.

    • [^] # Re: integrer sort et uniq dans awk?

      Posté par  . Évalué à 2.

      ça serait peut-être possible en utilisant la fonction system() de awk, mais je déconseille très fortement (c'est pas portable, et puis il y a mieux). En shell, quand on veut composer différents utilitaires, on utilise le caractère | qui redirige la sortie de la commande le précédent sur l'entrée de la commande suivante. Exemple :

      > ls -la | less

      Vu que ça fait partie des mécanismes de base quand on travaille en ligne de commande, je t'invite à jeter un oeil sur un tutoriel de shell.

    • [^] # Re: integrer sort et uniq dans awk?

      Posté par  . Évalué à 2.

      Je ne comprends pas bien ce que tu entends par "intégrer" sort et uniq dans awk…
      S'il s'agit d'appeler ces commandes depuis awk, ça ne présente pas un grand intérêt : autant faire un pipe avec "| sort | uniq -c".

      En revanche, il est possible de n'utiliser que des commandes awk sans aucun appel à des binaires externes (ce qui est tout de même plus intéressant) en utilisant un tableau (comme indiqué plus haut) dans lequel l'indice est la longueur de la chaîne et la valeur le nombre d’occurrences. Ça pourrait donner un script awk de ce genre là:

      {l[length($0)]++;}
      END {for (i in l) print i " " l[i];}

      Cela semble correspondre à ce que tu veux faire mais je ne garantis pas la compatibilité avec toutes les versions de awk (sur un Linux de moins de 10 ça devrait aller).

      • [^] # Re: integrer sort et uniq dans awk?

        Posté par  . Évalué à 2.

        utiliser que des commandes awk sans aucun appel à des binaires externes (ce qui est tout de même plus intéressant)

        c'est une affirmation générale qui n'est pas forcément vraie. Selon quel(s) critère(s) c'est mieux ?

        En terme de temps de développement, c'est clairement moins bien, vu que sort | uniq, c'est immédiat pour à peu près tout le monde sur ce forum.

        En terme de performances en temps de traitement, on ne peut jamais dire grand chose sans mesurer sur des données correspondant au cas réel. Je pense qu'une version tout en awk sera plus performante si on doit traiter un très grand nombre de fichier (parce qu'on économise des forks) mais pour le reste … (autre volumétrie, consommation mémoire, …)

        Dans l'absolu, entre deux solutions techniquement satisfaisantes, on va choisir en fonction des compromis fait par chaque version par rapport aux besoins qu'on a. Dans l'absolu, il y existe rarement une solution qui soit meilleure dans tous les cas.

        • [^] # Re: integrer sort et uniq dans awk?

          Posté par  . Évalué à 1.

          Je pense qu'il faut replacer ma remarque dans son contexte (et ce n'est donc pas une affirmation générale ;-)). D'ailleurs, pour ce type de besoin, je n'aurais personnellement pas opté pour une solution uniquement en awk (peut-être pour une question d'efficacité/rapidité de la solution, mais surtout pour des tas de raisons complètement subjectives).

          Mais ici, il s'agit de répondre à Braveorc qui, dans son post initial, indique que son objectif premier est de développer ses compétences sous awk. Dans ce cadre, il me semble donc bien plus intéressant de proposer une solution qui ne fait pas appel à des binaires externes…

          • [^] # Re: integrer sort et uniq dans awk?

            Posté par  . Évalué à 2.

            effectivement, j'avais un peu survolé ça :

            je travaille à approfondir mes connaissances qui sont très de base sur AWK

            mes confuses :)

  • # La donée

    Posté par  (site web personnel) . Évalué à 2.

    La donnée que tu veux affichée est un dictionnaire longueur de mot -> nombre de mots de cette longueur. Comment est représentée cette donnée dans ton programme?

    Pour une référence (en anglais) regarde dans Le Grymoire. C'est une des meilleures références qui soit pour apprendre les outils Unix en général. Montre-nous ton code si tu a des questions, c'est plus facile pour t'aider!

  • # clarification

    Posté par  . Évalué à 1.

    Effectivement mon but est de ne pas utiliser de pipe avec sort et uniq mais de trouver une façon équivalente et même meilleure directement dans awk. Merci des conseil je vais essayer ce que vous me proposez.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.