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 :

Script Bash capable d'extraire le nombre de mots utilisant chaque lettre de A à Z dans un fichier texte


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Par défaut Script Bash capable d'extraire le nombre de mots utilisant chaque lettre de A à Z dans un fichier texte
    Le but du script que je cherche est d'extraire le nombre de mots utilisant chaque lettre de l'alphabet de A à Z dans un fichier texte mis en paramètre $1.
    en faite, j'ai retrouvé un code script mais ce dernier compte le nombre de mots sur chaque ligne. La voici ci-dessous:


    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/bin/bash 
     
    #On détruit la valeur de la variable i (en fait une suppression du contenu) quand cette dernière prendra les valeurs comprises entre  A à Z
     
    for i in {A..Z}
    do
    	unset ${i}
    done
     
    #On crée alors une boucle pour parcourir toutes les lignes contenues dans le fichier texte à analyser
     
    while read line 
    #débuter le comptage de chaque lettre par ligne en commencant par zéro (0)
    do
    	XX=${line//[^A-Z]/}
    	i=0
     
    while [[ i -lt ${#XX} ]]
    #Incrémenter le comptage tant que la valeur du comptage de chaque lettre est inférieure au nombre de lignes contenu dans le fichier
    do
    	((${XX:$i:1}+=1))
    	((i+=1))
    done
    done <$1
     
    #On demande au script d'afficher, pour chaque lettre de l'alaphabet en commencant de A à Z (Tout en Majuscule), le nombre de fois que la lettre est affichée.(Les valeurs de A à Z seront données succesivement à la variable i)
     
    for i in {A..Z}
    do
    	echo ${!i=0} "mots contiennent la lettre" $i "dans le fichier $1"
     
    done
    Si vous pouvez bien m'aider à le modifier ou trouver carrément un autre code script pouvant faire celà.

    Le script doit afficher de la façon suivante:

    45 mots utilisent la lettre B
    30 mots utilisent la lettre Z
    29 mots utilisent la lettre A
    .........
    etc...

    Dans l'ordre de la plus utilisée à la moins utilisée.
      0  0

  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,

    on peut s'appuyer sur les tableaux associatifs en bash, donc un tableau $tab par exemple qui associera pour chaque lettre une valeur, par exemple ${tab[Z]}.

    l'algorithme peut se représenter comme suit :
    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
    # la moulinette
    on déclare un tableau associatif $tab
    pour chaque ligne $ligne dans le fichier
       pour chaque $mot dans $ligne
          on récupère les $lettres_uniques
       done
       pour chaque $lettre dans les $lettres_uniques
          on incremente lentrée $lettre dans le tableau $tab
       done
    done
     
    # l'affichage
    pour chaque $lettre dans $tab
      on affiche "${tab[$lettre]} mots utilisent la lettre $lettre"
    done | on trie sur la 1ere colonne, en numérique inversé
    astuces :
    • on oubliera pas de pré-traiter chaque ligne avant d'extraire les mots, l'idée c'est de garder uniquement [A-Z] + l'espace comme délimiteur de mots
    • récupérer les lettres uniques ça peut se faire de la façon suivante : grep -o . <<< $mot | sort -u | xargs, pour le mot CHOCOLAT on se retrouve alors avec C H O L A T sur lequel il est facile de boucler pour traiter lettre par lettre
    • incrémenter une valeur dans le tableau ça peut se faire via ((tab[$lettre]++)), syntaxe facile


    exemple :
    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
    21
    22
    23
    24
    25
    $ cat > fichier
    D'ARGENT, POINT DE CACHE. MAIS LE PERE FUT SAGE
    DE LEUR MONTRER, AVANT SA MORT,
    QUE LE TRAVAIL EST UN TRESOR.
    
    $ ./pouet.sh fichier
    13 mots utilisent la lettre E
    9 mots utilisent la lettre T
    7 mots utilisent la lettre R
    7 mots utilisent la lettre A
    5 mots utilisent la lettre S
    5 mots utilisent la lettre N
    4 mots utilisent la lettre U
    4 mots utilisent la lettre O
    4 mots utilisent la lettre L
    3 mots utilisent la lettre M
    3 mots utilisent la lettre I
    3 mots utilisent la lettre D
    2 mots utilisent la lettre V
    2 mots utilisent la lettre P
    2 mots utilisent la lettre G
    1 mots utilisent la lettre Q
    1 mots utilisent la lettre H
    1 mots utilisent la lettre F
    1 mots utilisent la lettre C
      1  0

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Bonjour,
    Pour le fun, ici, je considère que les mots sont séparé par autre chose que les caractères A-Z (en majuscule) et je ne compte que le nombre de mot pour chaque caractères A-Z (si pas de mot avec le caractère, celui-ci n'est pas affiché) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat Fichier
    D'ARGENT, POINT DE CACHE. MAIS LE PERE FUT SAGE
    DE LEUR MONTRER, AVANT SA MORT,
    QUE LE TRAVAIL EST UN TRESOR.
    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
    $ sed 's/[^A-Z ]/ /g;:xx;s/\([^ ]\)\([^ ]*\)\1/\1\2/;txx;s/ //g;s/./&\n/g' Fichier | sort | sed '/^ *$/d' | uniq -c | sort -rn
         13 E
          9 T
          7 R
          7 A
          5 S
          5 N
          4 U
          4 O
          4 L
          3 M
          3 I
          3 D
          2 V
          2 P
          2 G
          1 Q
          1 H
          1 F
          1 C
    Sinon, la partie interressante est la portion sed suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':xx;s/\([^ ]\)\([^ ]*\)\1/\1\2/;txx'
    qui retire les caractères en doublon dans une ligne de mots séparés par des espaces.
      2  0

  4. #4
    Membre éclairé Avatar de solo190
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 412
    Par défaut
    Bonsoir à tous,
    j'essaie de comprendre le script de veslover et la je suis bloquer sur cette instruction.
    Merci s'il vous plaît de m’éclairer.
      0  0

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

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

    il s'agit de Remplacement de paramètres (cf. man bash); voir ${paramètre:début:longueur},
    dans une Évaluation arithmétique (cf. man bash l'expression en italique)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.
      0  0

Discussions similaires

  1. recupérer un nombre dans un fichier texte
    Par coincoin22 dans le forum Linux
    Réponses: 10
    Dernier message: 13/08/2007, 11h37
  2. Réponses: 10
    Dernier message: 23/04/2007, 14h18
  3. Réponses: 3
    Dernier message: 04/01/2007, 17h42
  4. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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