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 :

Compter nombre de mots qui apparaissent n fois dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Compter nombre de mots qui apparaissent n fois dans un fichier
    Bonjour, je souhaite compter le nombre de mots qui apparaissent dans un fichier.
    Je ne sais pas comment le faire
    Pouvez-vous m'aider
    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Ce sont les mots d'une liste que tu veux compter ou tous les mots présents dans le texte ?
    Qu'as-tu déjà essayé comme commandes ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bonjour et Bienvenu,

    Déjà, la question de base pour ce genre de problème:
    Quelle serait pour toi la définition de "mot" informatiquement parlant ?
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    compter le nombre de mots qui apparaissent un nombre impair de fois
    il faut expliciter : on ne peut pas compter un nombre impair.

    soit on sait qu'un nombre est impair, alors la quantité est déjà dénombrée.
    soit...
    je te laisse définir ton algorithme.

    ce n'est pas aussi simple que ton exposé te le fais croire.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Un mot est pour moi une chaine de caractère sans espace. J'ai pensé au grep mais je suis débutant.
    La première etape serait de compter le nombre d'occurence pour chaque mot d'un texte

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Une méthode naïve:
    1. Découper le texte en un mot par ligne (grep)
    2. Transformer les majuscules en minuscules ou vice-versa (tr)
    3. trier le résultat (sort)
    4. compter les occurences de chaque mot de la liste triée (uniq)
    5. ne garder que les lignes avec des occurrences impairs (grep)


    donc, tout ton code tiendrait sur une seule ligne du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep .... fichier | tr .... | sort .... | uniq .... | grep ....
    Il ne te reste plus qu'a remplir (ou pas ) les pointillés
    Cordialement.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse j'ai donc fait ceci :

    grep ... monfichier | tr [A-Z] [a-z] | sort | uniq -c | grep ...

    Cependant je ne sais pas quoi mettre pour les deux grep.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Si on ne prend en compte que les espace comme séparateur de mots:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '[^[:space:]]*' monfichier | tr [A-Z] [a-z] | sort | uniq -c | grep '^ *[0-9]*[13579] '
    Mais perso, je retirerais aussi les ponctuations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '[^[:space:][:punct:]]*' monfichier | tr [A-Z] [a-z] | sort | uniq -c | grep '^ *[0-9]*[13579] '
    Maintenant, pour le jeu, tu pourrais essayer de le faire en pure builtin bash ou en awk, ce qui serait un bon entrainement
    Cordialement.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Super ca marche merci

  11. #11
    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
    awk -F'[[:space:][:punct:]]' '{for (i=1;i<=NF;i++) a[tolower($i)]++;} END{for (i in a) if (a[i]%2==1) print i;}' monfichier
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Pour le fun, une autre version awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS="[[:space:][:punct:]]"}{a[tolower($0)]++;}END{for (i in a) if (a[i]%2) print i;}' monfichier
    Manque plus que la version pure built-in
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    ouais, c'est pas super excitant non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    declare -Ai asArr
     
    while read line
    do
       for i in ${line//[[:punct:]]/ }
       do
          asArr["${i,,}"]+=1
       done
    done <fichier
     
    for i in ${!asArr[@]}; do ((asArr[$i]%2)) && echo "$i: ${asArr[$i]} occurrences"; done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    On dit ça quand on a l'habitude, mais demande à un débutant de le faire aussi beau...

    Et si tu veux du challenge, tu peux essayer de le faire sans des boucles explicites tels que while ou for...
    Cordialement.

  15. #15
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et si tu veux du challenge, tu peux essayer de le faire sans des boucles explicites tels que while ou for...
    J'aimerais bien savoir comment ?
    C'est une question, absolument rien d'ironique, je veux juste savoir ce à quoi tu penses et apprendre

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    avec des fonction récursives.
    à titre d'exercice, parce que dans la pratique ça alourdit le script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Rha, les fonctions récursives.... Je sais jamais quand utiliser ça et j'ai toujours du mal à les mettre en place.
    Mais déjà, perso, je sais pas lire un fichier en bash sans while... C'est peut-être trivial mais comment on fait ??
    Enfin, y'a readarray.
    Sinon, je voulais faire la version bash, mais j'arrivais à un truc bien moins classe et concis que toi.
    Merci à toi, et aux autres, on apprend toujours plein de trucs en vous lisant.

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonjour,

    Citation Envoyé par Postmortem Voir le message
    Enfin, y'a readarray.
    une recherche sur readarray m'a très vite fait découvrir cette discussion, avec des exemples sympas au début et tout à la fin un point qui m'amène à poser une question : elle est où la catastrophe, dans la discussion citée (look this catastrophe unix.stackexchange.com/questions/107800/using-while-loop-to-ssh-to-multiple-servers ) ?

    Parce que quand je parle de catastrophe, je donne un soupçon d'explications et, genre dans l'exemple a trivial example presque tout en haut de la page, vous allez vous rendre compte d'un problème avec prinft si vous utilisez un fichier dont les lignes commencent par le tiret_du_6, chose que j'utilise souvent ainsi :
    - ligne pour dire un truc
    - autre ligne pour dire autre chose
    En typographie on parle de "puces", et on a bien le droit d'utiliser ce tiret, sauf que voilà ce que je gagne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bash: printf: -  : option non valable
    printf : utilisation :printf [-v var] format [arguments]
    Si quelqu'un a une idée pour solutionner ce souci, elle sera la bienvenue.
    Pour vous simplifier la vie :
    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
    # touch fic_with_tirets.txt
    # echo premiere ligne >> fic_with_tirets.txt 
    # echo "- ligne avec tiret" >> fic_with_tirets.txt 
    # echo "- autre ligne avec tiret" >> fic_with_tirets.txt 
    # echo derniere ligne >> fic_with_tirets.txt 
    # declare -a myarray
    # let i=0
    # readarray -t myarray < fic_with_tirets.txt
    # while (( ${#myarray[@]} > i )); do printf "${myarray[i++]}\n"; done
    premiere ligne
    bash: printf: -  : option non valable
    printf : utilisation :printf [-v var] format [arguments]
    bash: printf: -  : option non valable
    printf : utilisation :printf [-v var] format [arguments]
    derniere ligne

    Sinon, comme il ne faut jamais utiliser ls, j'ai trouvé cette longue discussion pleine d'essais et d'exemples (je n'ai rien testé ), passez-y donc le week-end dessus,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    « -- » pour signaler la fin des options :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ printf '-blop\n'
    bash: printf: -b : option non valable
    printf : utilisation : printf [-v var] format [arguments]
    $ printf -- '-blop\n'
    -blop
    Et concernant la "catastrophe", c'est juste que ssh va "manger" toute l'entrée de la boucle qui aurait dû être mangée par "while read...".
    Et du coup, le contenu de la boucle n'est exécutée qu'une fois.
    Pour éviter cela, comme indiqué dans la discussion, il faut juste utiliser l'option "-n" de ssh ou rediriger son entrée standard de ssh depuis /dev/null.

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    « -- » pour signaler la fin des options :


    Champion, merci

    Et merci aussi pour l'explication "ssh".

    Bon wik,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Compter nombre de mots dans une cellule Excel
    Par nkhalidy dans le forum Excel
    Réponses: 6
    Dernier message: 12/07/2017, 21h12
  2. Réponses: 0
    Dernier message: 22/12/2014, 13h28
  3. Réponses: 0
    Dernier message: 29/06/2011, 10h50
  4. Réponses: 8
    Dernier message: 23/09/2008, 11h20
  5. Compter nombre de mots dans une chaîne.
    Par xVINCEx dans le forum C++
    Réponses: 22
    Dernier message: 24/11/2004, 13h33

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