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 :

[bash] Compter le nombre d'ocurrence d'une lettre


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut [bash] Compter le nombre d'ocurrence d'une lettre
    Bonjour,

    J'ai un fichier texte, et je souhaiterais compter, pour chacune des lettres de l'alphabet, combien de fois elles apparaissent dans ce fichier. Mais je ne sais pas trop coment faire.. awk, grep ...?

    Si quelqu'un a une piste svp ?
    Merci d'avance,

    Très cordialement,

    ANDRE Ani
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Un truc du genre devrait le faire…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in {A..Z}; do echo "${i} = $(grep -io ${i} <fichier | wc -l)";done | sort -nr -k3
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Merci beaucoup, je vais regarder cela en détails pour être sûr de bien tout comprendre.
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  4. #4
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Une version avec awk qui ne passe qu'une seule fois dans le fichier.


    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
     
    BEGIN{
    split("a b c d e f g h i j k l m n o p q r s t u v w x y z",alphabet)
     
    for ( lettre in alphabet )
     {
                 Comptage[lettre]=0
     }
     
    }
    {
    for ( lettre in alphabet )
     {
                 Comptage[lettre]=Comptage[lettre] +  gsub(alphabet[lettre], alphabet[lettre],$0)
     }
    }
    END{
     
    for ( lettre in alphabet )
    {
            print alphabet[lettre] " " Comptage[lettre]
    }
     
    }

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    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
    $ sed 's/.*/\L&/;s/./&\n/g' fichier |sort|uniq -c|grep -i [a-z]
        266 a
         39 b
        122 c
         44 d
        243 e
         24 é
         12 f
         76 g
         96 h
        411 i
         20 j
         28 k
         95 l
        232 m
         94 n
        242 o
         34 p
         84 q
         99 r
        172 s
         86 t
        146 u
         18 v
          5 w
         11 x
         33 y
          6 z
    Il faudra penser à une translittération des caractères accentués avec la commande sed 'y' mais je ne l'ai pas sous la main.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour tout les caractères:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    $ awk '{
    >   n=length($0)
    >   for (i=0;i<n;i++)
    >   {
    >     caractere=substr($0,i,1)
    >     tableau_caractere[caractere]+=1
    >   }
    > }
    > END {
    >   for (id in tableau_caractere) {
    >     printf "%s => %d\n", id, tableau_caractere[id]
    >   }
    > }' fichier
      => 88
    é => 5
    " => 78
    í => 1
    & => 2
    , => 2
    - => 3
    . => 185
    / => 470
    0 => 92
    1 => 56
    2 => 43
    3 => 33
    4 => 35
    5 => 46
    6 => 26
    7 => 38
    8 => 33
    9 => 32
    : => 61
    ; => 2
     => 2
    < => 375
    = => 41
    > => 102
    ? => 3
    A => 32
    B => 39
    C => 32
    D => 31
    E => 20
    F => 28
    G => 28
    H => 20
    I => 18
    J => 20
    K => 24
    L => 27
    M => 27
    N => 22
    O => 21
    P => 13
    Q => 26
    R => 16
    S => 34
    T => 34
    U => 27
    V => 23
    W => 30
    X => 25
    Y => 30
    Z => 24
    _ => 1
    a => 252
    b => 161
    c => 88
    d => 160
    e => 333
    f => 35
    g => 255
    h => 178
    i => 260
    j => 100
    k => 37
    l => 121
    m => 267
    n => 148
    o => 266
    p => 277
    q => 25
    r => 312
    s => 92
    t => 463
    u => 143
    v => 75
    w => 74
    x => 35
    y => 50
    z => 33

  7. #7
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Merci beaucoup pour tout !
    J'ai juste besoin de compter les lettres de l'alphabet, pas besoin de se préoccuper des accents ou autre, tout est en majuscule.

    Je vais étudier tout cela pour arriver à bien en comprendre le fonctionnement.
    Il faut aussi que je vois comment on fait pour passer des paramètres à un script, comme le nom du fichier à lire ici.

    Merci encore pour tout ;-)
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,
    Voici aussi pour le fun, une version Built-in Bash (ne tiens compte que des lettres en majuscules):
    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
    $ cat script.bash 
    #!/usr/bin/bash
     
    for i in {A..Z}
    do
     unset ${i}
    done
    while read line
    do
     XX=${line//[^A-Z]/}
     i=0
     while [[ i -lt ${#XX} ]]
     do 
      ((${XX:$i:1}+=1))
      ((i+=1))
     done
    done <$1
    for i in {A..Z}
    do 
     echo $i"="${!i=0}
    done
    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
    $ ./script.bash file.txt 
    A=14
    B=12
    C=5
    D=0
    E=3
    F=3
    G=0
    H=0
    I=5
    J=0
    K=0
    L=16
    M=0
    N=5
    O=5
    P=0
    Q=0
    R=0
    S=4
    T=5
    U=0
    V=0
    W=0
    X=6
    Y=0
    Z=0
    @Flodelarab: tu aurais pu factoriser les 2 commandes "s" de sed en une seule
    Cordialement.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    Hello,
    Je suis débutant dans ce domaine, mais je me demande pourquoi dans sed vous faite '\L'.
    Pour être honnête, je ne comprends pas ce \L dans la ligne de commande. En même temps, si vous avez une bonne référence/tutorial de sed.

    Merci de votre aide.

    Citation Envoyé par Flodelarab Voir le message
    Bonjour,

    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
    $ sed 's/.*/\L&/;s/./&\n/g' fichier |sort|uniq -c|grep -i [a-z]
        266 a
         39 b
        122 c
         44 d
        243 e
         24 é
         12 f
         76 g
         96 h
        411 i
         20 j
         28 k
         95 l
        232 m
         94 n
        242 o
         34 p
         84 q
         99 r
        172 s
         86 t
        146 u
         18 v
          5 w
         11 x
         33 y
          6 z
    Il faudra penser à une translittération des caractères accentués avec la commande sed 'y' mais je ne l'ai pas sous la main.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Il est vrai que la documentation sur le sujet est difficile à trouver (même si elle existe https://www.gnu.org/software/sed/man...s_0022-Command)...

    Le fameux '\L' sert ici à transformer ce qui suit en minuscule (L comme lower), il y a son équivalent pour les majuscules que je te laisse rechercher pour exercice.

    Attention tout de même, ce genre de syntaxe fait partie des extensions gnu.
    Cordialement.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    Un grand merci pour la réponse, mais je viens de remarquer que mon problème est du a la version de busybox sur une box android, car apparemment, toutes les fonctions de sed ne sont pas implémentées,

    Grrrr c'est énervant.

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

Discussions similaires

  1. Compter le nombre de caractère d'une chaîne
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 18h04
  2. Compter le nombre d'apparitions d'une valeur
    Par dynexd dans le forum Access
    Réponses: 4
    Dernier message: 07/04/2006, 01h30
  3. Réponses: 2
    Dernier message: 06/01/2006, 23h18
  4. Réponses: 9
    Dernier message: 22/11/2005, 21h20
  5. [C#] Compter le nombre de TEXTBOX sur une page ASPX
    Par alain_27 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 27/05/2005, 14h19

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