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 :

Premier script Shell.


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 1
    Par défaut Premier script Shell.
    Bonjour,

    alors voila, je suis un Mooc sur Linux et je dois, pour un exercice, écrire un script pour le shell.
    Ce script, à partir d'un fichier (dico.txt) doit me dire combien de fois il y a chaque lettres de l'alphabet dans la liste de mots du fichier dico.txt

    Malgrès mes recherches, je ne sais pas trop comment commencer ...

    je dois obtenir un resultat qui ressemble à ça :
    278814 - E
    229938 - A
    219131 - I
    210391 - R
    ...

    J'ai donc pensé à la commande grep.

    Voici mon debut de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    grep -c A | grep -c B | grep -c C ... >> resultats.txt
    mais ça ne marche pas vraiment à l’exécution ... (Command not found). De plus, je me demande si il n'y a pas une meilleure méthode que taper cette commande pour chaque lettre de l'alphabet ...

    Merci pour vos idées.


  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    effectivement -et au plus simpliste- en jouant avec les options de grep y'a moyen de s'en sortir, je rajouterai probablement wc aussi, en commençant par ne compter qu'une seule lettre pour commencer, le reste suivra

    nb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "abracadabra" | grep -c a
    1   # on devrait avoir 5 ici, pas 1 ;)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pense à vider le fichier avant de passer ta commande et il faut indiquer un fichier à grep pour ne pas avoir d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    > resultats.txt
    grep -c A dico.txt >> resultats.txt
    grep -c B dico.txt >> resultats.txt
    grep -c C dico.txt >> resultats.txt
    Par contre grep tient compte de la casse par défaut et comptera le nombre de ligne et non le nombre de caractère.

    Voici une solution pour ignorer la casse et compter le nombre de caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -io A dico.txt | wc -l
    D'autres solutions ici :
    http://www.developpez.net/forums/d14...ence-d-lettre/

    Mais ça n'affichera que le nombre de caractère et au final tu voudras quelque chose comme ça : 229938 - A
    Il va donc falloir utiliser la commande echo qui peut afficher le résultat d'une commande si on l'entoure de :
    $()
    Dans ton cas ceci devrait te plaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$(grep -io A dico.txt | wc -l) - A"
    Je te laisse combiner ça avec une boucle for pour passer tout l'alphabet, ce fera un script beaucoup plus court au final et tout aussi efficace
    Il y a un exemple dans le lien que je t'ai donné.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,
    La commande awk semble être la plus pertinante pour ce genre d'exercice.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je ne vois pas trop comment faire quelque chose de simple avec awk dans ce cas ...
    Ici je compte tout les caractères et je différencie les majuscules et les minuscules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    awk '{ #NF = nb element
      for (i=1;i<=NF;i++) {
        nb=length($i)
        for (j=0;j<nb;j++) {
          tableau_id[substr($i,j,1)] += 1
        }  
      }
    }
    END { for (id in tableau_id) {
        printf "%s - %s\n", tableau_id[id], id
      }
    }' dico.txt
    Ceci n'est-il pas plus pertinent pour son exercice ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    for i in {a..z}
    do
      echo "$( grep -io $i dico.txt | wc -l | sed 's/^ *//' ) - $i"
    done
    ps: zut j'ai fait l'exercice en entier

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    @ecatomb:
    Une autre version awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F '' '{for (i=1;i<=NF;i++) $i ~ /[A-Za-z]/ ? A[toupper($i)]+=1 : 0};END{for (i in A) {printf "%s - %s\n", A[i], i}}' dico.txt
    L'avantage de passé par awk est de ne parser le fichier qu'une seule fois.
    La version bash avec la boucle for, le grep, le wc et le sed, peut paraître plus simple, mais elle est loin d'être efficace.

    Ou alors, il faudrait qu'elle ne parse qu'une seul fois le fichier (et pourquoi pas juste en Builtin )

Discussions similaires

  1. Shell - premier script : besoin de conseils
    Par Invité dans le forum Linux
    Réponses: 1
    Dernier message: 28/10/2007, 20h42
  2. Supprimer la premiere lettre dune chaine en script shell sh
    Par caesarvanou dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 10/01/2006, 18h41
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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