Forum Programmation.shell Encore...

Posté par  (site web personnel) .
Étiquettes : aucune
0
5
sept.
2005
Rebonjour !
J'ai un dernier script à écrire et je ne vois vraiment pas trop comment m'y prendre.

L'idée étant qu'on fournit au script un fichier et optionnellement un mot.

Si on fournit juste le nom de fichier il nous donne la liste de tous les mots employés avec le nombre d'occurrences et si on fournit un mot il compte le nombre d'occurrences de ce mot.

Et pour le coup j'ai vraiment aucune idée de la méthode à employer :/...
  • # Hmm

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

    Bon juste un piste cette fois :)

    Tu remplaces les espaces et signes de ponctuation par des retour chariot, tu pipe ca a sort puis à uniq -c
    • [^] # Re: Hmm

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

      j'appelle pas ca une piste mais un boulevard :op

      il n'y a qu'a suivre les fleches !
      • [^] # Re: Hmm

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

        hé dis donc, j'adore linux mais c'est le troisième script de ma laïfe....
        J'ai juste pas encore trop l'esprit tourné comme il faut :)
        Mais ouais il vaut mieux une piste qu'on explore qu'une commande obscure qu'on pige pas.
    • [^] # Re: Hmm

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

      Yep.
      Donc si j'imagine bien ce sera du sed pour remplacer espaces et tout ca. D'après man, uniq me donnera une occurence unique pour chaque mot, ligne par ligne. Donc d'après moi, je reprends mot par mot et je scanne et je scanne en comptant les occurrences.
      Oh my god, non uniq le fait déja comme un grand !
      Donc du coup si je veux un seul mot je sors le grep et sinon je le laisse tourner...
      J'ai bon ? J'ai bon ? :)
      Ca a l'air ultra facile dit comme ca !
      Bon je vais trifouiller un peu et je me ramène avec mes questions !
      • [^] # Re: Hmm

        Posté par  . Évalué à 3.

        Ca se voit que c'est la rentrée !!! Essaie de chercher un peu par toi-même, ca te sera plus profitable. T'as pas un cours Unix?
        • [^] # Re: Hmm

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

          J'essaie de chercher par moi-même, t'en fais pas pour moi, mais y a des fois ou ben il faut demander un coup de main.
          Mes cours unix sont soporifiques, donnés dans un anglais affreux par un prof sympa mais vraiment très chiant.
          J'aime beaucoup quand on me donne une piste plutôt que de me laisser complètement dans le vent ou alors quand on me donne une commande obscure en me disant tais toi et tape...
          Pour l'instant j'ai du mal a remplacer les espaces par des retours chariots.
          Il me manque juste la manière de dire 'retour chariot' en sed
          J'ai essayé des trucs du style
          sed 's/ /\n/g' mais ca ne marche pas et je ne trouve pas d'exemple qui convienne....mhh
          • [^] # Re: Hmm

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

            hmm j'ai trouvé mais je trouve ca quand même étrange que sed ne comprenne pas le \n...
            • [^] # Re: Hmm

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

              J'arrive a remplacer les espaces par des retour chariots en mode interactif en insérant un vrai retour chariot apres le \ d'échappement, mais visiblement il ne le comprend pas de la même manière en script... Quelqu'un a une idée ? Je vous mets la tronche de mon script.
              #!/bin/bash
              #wordfreq : displays word frequencies in a given file and can give the frequency of one particular word as well
              #usage : wordfreq filename [word]
              
              #variable init
              fileNotFoundError=1
              syntaxError=1
              fileToParse=
              filter=
              #as usual we check the options given
              if [ $# = 0 ]
                  then
                  syntaxError=0
              fi
              #we know we have the right number of arguments, let's check whether the file exists or not
              if [ ! -e $1 ]
                  then
                  fileNotFoundError=0
                  else
                  fileToParse=$1
                  if [ $# = 2 ]
              	then
              	filter=" grep "${2}
                  fi
              fi
              #let's handle the errors
              if [ $syntaxError = 0 ]
                  then
                  echo Syntax error.
                  echo usage : wordfreq filename [word]
                  exit 1
                  else
                  if [ $fileNotFoundError = 0 ]
              	then
              	echo Error, the specified file was not found.
              	exit 1
                  fi
              fi
              #we build the command
              command="cat "${fileToParse}" | sed 's/ /\
              /g' | uniq -c"${filter}" | awk '{print \$2, \$1}'"
              echo $command
              
              • [^] # Re: Hmm

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

                Bon ben pour le coup je trouve vraiment pas comment insérer ca dans le script. \n ne marche pas, insérer un véritable retour chariot ne marche pas non plus, c bien la lutte donc si quelqu'un pouvait me tendre une perche ce serait sympa...
                • [^] # Re: Hmm

                  Posté par  . Évalué à 3.

                  Tu peux supprimer 'cat' (il ne sert à rien) et utiliser 'tr' plutôt que 'sed' pour remplacer les espaces et les tabulations (\t) par des \n.
                  En plus, tu dois trier avant de passer dans 'uniq' qui ne traite que des données triées.
                  Ca donne, lorsque tu n'as pas à restreindre à un seul mot:
                  tr '[ \t]' '[\n*]' < ${fileToParse} | sort | uniq -c | awk '{print $2, $1}'

                  Dans le cas où tu ne dois traiter qu'un seul mot, il vaudrait mieux faire le grep à la place du sort plutôt qu'après uniq (ça évite de passer du temps à trier tout un fichier pour ne garder que quelques mots):
                  tr '[ \t]' '[\n*]' < ${fileToParse} | grep $2 | uniq -c | awk '{print $2, $1}'

                  Il ne te reste plus qu'à trouver comment remplacer sort par grep en fonction du nombre d'arguments ;)
                • [^] # Re: Hmm

                  Posté par  . Évalué à 1.

                  Essaie du côté de sed -f ...
          • [^] # Re: Hmm

            Posté par  . Évalué à 3.

            Si tu veux progresser, va faire un tour de temps en temps sur fr.comp.os.unix (via google groups par ex), on y trouve ce genre de questions, et c'est plein de petites astuces. Je suis sur que la réponse y est. Sinon tu trouveras plein d'infos (en vrac bien sur) sur la programmation de scripts shell (pourquoi éviter le cat |grep par exemple).
          • [^] # Re: Hmm

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

            Guide shell script en anglais
            http://www.tldp.org/LDP/abs/html/index.html(...)

            Guide shell script en français (le même mais un peu moins à jour)
            http://www.bsdbooks.net/shells/scripting/fr/(...)

Suivre le flux des commentaires

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