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
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
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.
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.
il faut expliciter : on ne peut pas compter un nombre impair.compter le nombre de mots qui apparaissent un nombre impair de fois
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.
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
Une méthode naïve:
- Découper le texte en un mot par ligne (grep)
- Transformer les majuscules en minuscules ou vice-versa (tr)
- trier le résultat (sort)
- compter les occurences de chaque mot de la liste triée (uniq)
- ne garder que les lignes avec des occurrences impairs (grep)
donc, tout ton code tiendrait sur une seule ligne du type:
Il ne te reste plus qu'a remplir (ou pas ) les pointillés
Code : Sélectionner tout - Visualiser dans une fenêtre à part grep .... fichier | tr .... | sort .... | uniq .... | grep ....
Cordialement.
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.
Si on ne prend en compte que les espace comme séparateur de mots:
Mais perso, je retirerais aussi les ponctuations:
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] '
Maintenant, pour le jeu, tu pourrais essayer de le faire en pure builtin bash ou en awk, ce qui serait un bon entrainement
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] '
Cordialement.
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.
Pour le fun, une autre version awk:
Manque plus que la version pure built-in
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
Cordialement.
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
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.
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.
Bonjour,
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 :
Si quelqu'un a une idée pour solutionner ce souci, elle sera la bienvenue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 bash: printf: - : option non valable printf : utilisation :printf [-v var] format [arguments]
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
« -- » pour signaler la fin des options :
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...".
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 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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager