#1 Le 12/09/2008, à 08:25
- achara
Questions d'un débutant (manipulation de texte)
Bonjour.
J'espêre ne pas trop vous faire rigoler vu la "simplicité" de mes questions, mais ne sachant pas trop ou les poster je me permets de le faire ici.
Je suis dans un IUT d'informatique, et suite à mon premier cours, nous avons un travail à faire à la maison, qui consiste à comparer deux textes et y faire quelques modifications via le shell.
J'ai déja pas mal avancé, mais je bloque sur quelques questions.
Je dois par exemple :
• trouver le nombre de caractères : ici j'ai fais un "wc" et j'ai pris le résultat de la troisieme collone
• trouver le nombre de caractères, sans espaces : je ne sais pas comment donner à l'instruction "wc" le fait de ne pas compter les " "
• trouver le nombre de lettres : de même, comment ne pas compter les virgules, points d'interrogation et assimilés par wc ?
J'ai trouvé des explications avec la commande "awk", mais ne l'ayant pas vue en cours j'essaie d'abord de comprendre avec "wc", si cela est toutefois possible.
Je dois ensuite compter le nombre de mots, ce que je sais faire, puis de la même façon en enlever certains dont je dois moi même créer la liste (mots vides = le, la, les, et...). Cela équivaut je pense à la même question que précédemment, c'est à dire "enlever" des items/caractères avec la commande wc.
Pour finir, et je m'excuse vraiment de vous demander ça, je dois : Compter le nombre de paragraphes (les /r et /n sont censés m'aider), compter le nombre de phrases (grâce à la poncuation) puis, le sommum de la difficulté pour moi, calculer le nombre moyen de phrases par paragraphe.
Je vous prie de bien vouloir m'excuser pour ce pavé,
en espêrant ne pas vous causer trop de soucis (on sait jamais ^^) et en vous remerciant par avance,
Achara
Hors ligne
#2 Le 12/09/2008, à 08:33
- genma
Re : Questions d'un débutant (manipulation de texte)
Je dois ensuite compter le nombre de mots, ce que je sais faire, puis de la même façon en enlever certains dont je dois moi même créer la liste (mots vides = le, la, les, et...). Cela équivaut je pense à la même question que précédemment, c'est à dire "enlever" des items/caractères avec la commande wc.
Je te propose la bidouille suivante (en shell)
cat fichiertexte.txt | sed 's/champAremplacer1//g' |sed 's/champAremplacer2//g'|sed 's/champAremplacer3//g'| wc
cat fichiertexte.txt : lecture de tout le fichier que l'on passe à 'sed' via le premier pipe.
sed 's/champAremplacer1//g' : sed remplace (substitute) le champARemplacer1 (par exemple l'espace) par rien (c'est pour ça qu'on a //, si on veut toto, on aura /toto et /g dit que c'est global, partout.
On enchaine (via encore un pipe, le |) sur un second sed, puis un troisième et le flux de texte est passé à wc qui compte un texte sans espace, sans saut de ligne.
Sinon si la liste est trop longue, une boucle sur un fichier contenant ta liste de mots et tu fais des sed sur tout ça.
"Lorsque tu as découvert le libre, tu sais que tu ne pourras plus jamais revenir en arrière".
Utilisateur d'Ubuntu depuis la version 4.10 !
Mon blog ? https://blog.genma.fr
Mon twitter? http://twitter.com/genma
Hors ligne
#3 Le 12/09/2008, à 08:41
- iuchiban
Re : Questions d'un débutant (manipulation de texte)
man est ton ami.
Ca te donne toutes les options des commandes disponibles.
Par exemple :
man awk
te dira par exemple que
length : te donne la longueur de la chaine
man wc
wc - Afficher le nombre d'octets, de mots et de lignes d'un fichier.
Mais je pense que ca ne sera pas te rendre service que de te donner toutes les commandes toutes machées.
Il faut faire des recherches, faire des tests, éventuellement si tu penses avoir un bon truc mais qui ne donne pas le résultat attendu, venir ici pour demander de l'aide.
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#4 Le 12/09/2008, à 09:08
- achara
Re : Questions d'un débutant (manipulation de texte)
Je vous remercie pour vos réponses aussi rapides !
J'ai besoin d'y réfléchir, ceci n'étant vraiment pas simple pour moi, mais il me reste quelques points à éclaircir avant de me prendre la tête...
* trouver le nombre de caractères, sans espaces : je ne sais pas comment donner à l'instruction "wc" le fait de ne pas compter les espaces
cat nom_de_mon_fichier.txt | sed 's/""//g' | wc
Vous parait il correct ? (si j'ai bien compris la syntaxe, dans mon fichier texte les espaces - que j'ai mis ici sous forme symbolique "", je ne sais pas comment les symboliser - sont remplacés par "rien", donc mes mots vont se coller et le wc me donnera le nombre de caractères, sans espaces, vu qu'il n'y en aura plus ?
Par exemple :
man awk
te dira par exemple que
length : te donne la longueur de la chaine
je ne comprends pas le sens de "la longueur" de la chaine : est-ce le nombre de caractères (avec ou sans espaces ?), le nombre d'octets ... ?
J'ai beau faire un man de wc, je ne sais toujours pas comment enlever un "item" à ne pas compter, je me demande si c'est possible ou pas ?
Je vous prie une nouvelle fois de m'excuser, je ne fais pas expres de ne pas comprendre
Hors ligne
#5 Le 12/09/2008, à 09:08
- Totor
Re : Questions d'un débutant (manipulation de texte)
si c'est pour un "1er cours" de "1ère année", ça me semble d'un niveau assez élevé !
l'énoncé de l'exercice stipule qu'il ne faut utiliser que wc ?
-- Lucid Lynx --
Hors ligne
#6 Le 12/09/2008, à 09:14
- achara
Re : Questions d'un débutant (manipulation de texte)
non, j'ai vu des commandes telles que tr (d'ailleurs je pourrais peut être faire un cat nom_du_fichier.txt | tr -s [:blank:] "\n" | wc pour l'histoire des sauts de ligne ?) sort et uniq (non utiles ici ?), les pipes, grep, sed, diff, et paste.
Linux n'est vraiment pas mon domaine, je suis conscient que ce sont des manipulations basiques en programmation, mais les cours n'étant pas (très) bien faits (peu ou pas d'exemples) je galère vraiment...
Hors ligne
#7 Le 12/09/2008, à 09:49
- achara
Re : Questions d'un débutant (manipulation de texte)
Aller, j'avance un peu.
Grâce à vos suggestions (et un petit peu de cassage de tête) j'ai pu trouver quelques réponses...
Est-ce que cela vous parait correct si :
* pour trouver le nombre de caractères, sans espaces, je fais
cat mon_fichier.txt | sed 's/[:blanck:]//g' | wc
et que je prends le résultat de la troisième collone ?
En revanche, je ne comprends pas la différence entre "le nombre de caractères (sans les espaces)" et "le nombre de lettres" ?
Hors ligne
#8 Le 12/09/2008, à 09:55
- iuchiban
Re : Questions d'un débutant (manipulation de texte)
Je vous remercie pour vos réponses aussi rapides !
J'ai besoin d'y réfléchir, ceci n'étant vraiment pas simple pour moi, mais il me reste quelques points à éclaircir avant de me prendre la tête...
Ca n'est simple pour personne la première fois
je ne comprends pas le sens de "la longueur" de la chaine : est-ce le nombre de caractères (avec ou sans espaces ?), le nombre d'octets ... ?
les caractères étant codés sur un octet (le code ASCII étendu comporte 256 caractère, soit un octet), compter le nombre d'octet te donne le nombre de caractères
si c'est pour un "1er cours" de "1ère année", ça me semble d'un niveau assez élevé !
En même temps, ce sont là toutes les commandes de base pour faire du script shell, même si c'est vrai qu'ils auraient pu commencer par un
echo "Hello World"
Sinon, là encore le man indique :
pour tr :
tr - Transposer ou éliminer des caractères.
Quand seule l'option --delete (-d) est fournie, tr supprime tous les caractères d'entrée présents dans jeu1.Quand seule l'option --squeeze-repeats (-s) est fournie, tr remplace chaque répétitions de caractères appartenant au jeu1 par une seule occurence de ce caractère.
donc ta commande :
cat fichier.txt | tr -s [:blank:] "\n" | wc
remplace tous les espace blancs par un seul saut de ligne donc transforme par exemple :
bonjour et bienvenue
en
bonjour
et
bienvenue
Tu pourrais donc de cette manière et avec l-option -l, compter le nombre de lignes, donc de mots de ta phrase.
Si tu veux le nombre de lettres, il faut plutôt utiliser :
cat fichier.txt | tr -s [:blank:] | wc
Comme ça tu enlèves tous les espaces et tu comptes le nombre d'octets.
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#9 Le 12/09/2008, à 10:03
- Totor
Re : Questions d'un débutant (manipulation de texte)
trouver le nombre de caractères : nb=$(($(wc -m < fichier.txt)-$(wc -l < fichier.txt)))
trouver le nombre de caractères, sans espaces : nb=$(($(sed 's/[[:blank:]]//g' nom_fichier|wc -m)-$(wc -l < fichier.txt)))
trouver le nombre de lettres : nb=$(($(grep -o [a-zA-Z] nom_fichier|wc -m)/2))
trouver le nombre de paragraphe : nb=$(sed '/^$/d' nom_fichier|wc -l)
trouver le nombre de mot : nb=$(wc -w < nom_fichier)
trouver le nombre de mot sans certain (à tester) : nb=$(sed 's/^(.*[\. ]){0,1}(mot1|mot2|...)[\.\!\? :]{0,1}(.*)$/\1 \3/g' | wc -w)
Compter le nombre moyen de phrase, je te donne juste une piste :
while read paragraphe
si pas ligne vide
trouver le nombre de phrase pour ce paragraphe
fin si
do
done < nom_fichier
calculer le nombre de paragraphe
calculer la moyenne
Dernière modification par Totor (Le 12/09/2008, à 14:20)
-- Lucid Lynx --
Hors ligne
#10 Le 12/09/2008, à 10:04
- achara
Re : Questions d'un débutant (manipulation de texte)
Tout d'abord, je te remercie iuchiban, pour ta réponse précédente qui m'a fait comprendre énormement de choses, je commence à bien avancer et ma journée est de plus en plus ensoleillée
Toutefois, je me posais une autre question.
Lorsque tu dis
Si tu veux le nombre de lettres, il faut plutôt utiliser :
Code:
cat fichier.txt | tr -s [:blank:] | wc
Comme ça tu enlèves tous les espaces et tu comptes le nombre d'octets.
Si je comprends bien, il va me rester tout le texte, sans les espaces, mais il va me rester la ponctuation... puis-je faire à ce moment là un
cat fichier.txt | tr -s [:blank:] [:punct:] | wc
?
j'ai une erreur lorsque je fais cat fichier1.txt | tr -s [:blank:] [:punct:] | wc
tr: lors de traductions la seule classe de caractères pouvant apparaître
dans chaîne2 est « upper » ou « lower »
0 0 0
Je vais tester de mon coté, je veux juste un avis pour savoir si je suis dans le juste ou non
/!\ Réponse de Totor (tout d'abord merci beaucoup pour les réponses ^^) entre temps
trouver le nombre de caractères : nb=$(wc -m < nom_fichier)
trouver le nombre de caractères, sans espaces : nb=$(sed 's/[[:blank:]]//g' nom_fichier|wc -m)
trouver le nombre de lettres : nb=$(grep -o [a-zA-Z] nom_fichier|wc -m)
trouver le nombre de paragraphe : nb=$(sed '/^$/d' nom_fichier|wc -l)
trouver le nombre de mot : nb=$(wc -w < nom_fichier)
trouver le nombre de mot sans certain (à tester) : nb=$(sed 's/^(.*[\. ]){0,1}(mot1|mot2|...)[\.\!\? :]{0,1}(.*)$/\1 \3/g' | wc -w)
pour essayer de comprendre, qu'est-ce que le "nb=$" ? comment donner à tes fonctions (la syntaxe) l'ordre de travailler sur un fichier précis (fichier1.txt par exemple ?)
Dois je faire par exemple pour ta première réponse
cat fichier1.txt | nb=$ (pas compris ?) (wc -m < nom_fichier) ?
Merci !
Dernière modification par achara (Le 12/09/2008, à 10:15)
Hors ligne
#11 Le 12/09/2008, à 10:14
- Totor
Re : Questions d'un débutant (manipulation de texte)
en fait nb=$(command) permet d'affecter le résultat de l'instruction command (qui est dans la sortie standard) à la variable nb
donc nb=$(wc -m < nom_fichier) permet d'avoir le résultat de wc -m < nom_fichier (calculer le nombre de caractères du fichier nom_fichier) dans la variable nb
Dernière modification par Totor (Le 12/09/2008, à 10:15)
-- Lucid Lynx --
Hors ligne
#12 Le 12/09/2008, à 10:15
- iuchiban
Re : Questions d'un débutant (manipulation de texte)
Tout d'abord, je te remercie iuchiban, pour ta réponse précédente qui m'a fait comprendre énormement de choses, je commence à bien avancer et ma journée est de plus en plus ensoleillée
T'es pas en région parisienne toi, parce que vu le temps qu'il fait, c'est plutôt de la pluie
Toutefois, je me posais une autre question.
Lorsque tu dis
Si tu veux le nombre de lettres, il faut plutôt utiliser :
Code:
cat fichier.txt | tr -s [:blank:] | wc
Comme ça tu enlèves tous les espaces et tu comptes le nombre d'octets.Si je comprends bien, il va me rester tout le texte, sans les espaces, mais il va me rester la ponctuation... puis-je faire à ce moment là un
cat fichier.txt | tr -s [:blank:] [:punct:] | wc
?
Tu puis-je tout à fait et c'est même recommandé de tester (fait des copie de tes fichiers de travail au cas où tu les efface).
Mais c'est en testant les fonctions qu'on découvre de nouvelles choses et que l'on comprend comment ça fonctionne.
qu'est-ce que le "nb=$" ?
Il faut lire $(<Commande) qui est équivalent à l'ancienne notation `<Commande>`
En fait, ça te permet de récupérer le résultat de <Commande>.
Par exemple, tu veux fair eune action sur certains fichiers, mettons toutes tes images jpg :
ls | grep *.jpg
te donne une liste des images en .jpg
for i in $(ls | grep *.jpg)
do
<ActionAEffectuerSurToutesLesJPG>
done
te permet d'effectuer <ActionAEffectuerSurToutesLesJPG> sur chacun des fichiers.
Tu verras qu'il y a souvent (toujours ??) plusieurs moyen de coder une même fonction, comme compter le nombre de caractères via wc, avec sed ou awk, etc.
Bon courage.
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#13 Le 12/09/2008, à 10:16
- achara
Re : Questions d'un débutant (manipulation de texte)
merci beaucoup pour tout ça, j'y retourne
Hors ligne
#14 Le 12/09/2008, à 11:08
- achara
Re : Questions d'un débutant (manipulation de texte)
Ok, j'ai presque fini.
Je cherche maintenant à enlever les mots vides pour trouver le nombre de mots.
Je peux faire "cat fichier1.txt | sed 's/le//g' | sed 's/la//g' | sed 's/les//g' | wc" en rajoutant un pipe à chaque mot, mais cela me parait fastidieux.
J'ai trouvé sur internethttp://www.webrankinfo.com/forums/viewtopic_56224.htmune liste de mots vides, que j'ai enregistré sous le nom "motsvides.txt".
Y'aurait-il une méthode pour utiliser ce fichier en tant que base de donnée, pour m'éviter de retaper tous les mots ?
je pensais à quelque chose du style cat fichier1.txt | sed 's/motsvides.txt//g' | wc ?
Merci (encore !) d'avance !
Hors ligne
#15 Le 12/09/2008, à 11:10
- achara
Re : Questions d'un débutant (manipulation de texte)
ça fonctionne en faisant
cat fichier1.txt | sed 's/[motsvides.txt]//g' | wc
Je suis génial :cool::cool::cool::cool:
Hors ligne
#16 Le 12/09/2008, à 11:53
- achara
Re : Questions d'un débutant (manipulation de texte)
Ok, pas si génial que ça :
* Compter le nombre de ponctuations dans un texte
* Compter le nombre de paragraphes dans un texte (en m'aidant des sauts de ligne)
* Compter le nombre de phrases dans un texte (en m'aidant de la ponctuation je pense)
Par exemple, pour le nombre de paragraphes, lorsque je suis la réponse de Totor nb=$(sed '/^$/d' fichier1.txt|wc -l) rien ne s'affiche.
Je n'ai vraiment pas d'idées... :(
Une ame charitable ?
Dernière modification par achara (Le 12/09/2008, à 11:56)
Hors ligne
#17 Le 12/09/2008, à 12:20
- Totor
Re : Questions d'un débutant (manipulation de texte)
Ok, pas si génial que ça :
Par exemple, pour le nombre de paragraphes, lorsque je suis la réponse de Totor nb=$(sed '/^$/d' fichier1.txt|wc -l) rien ne s'affiche.
voilà qui est bien étrange : je viens de faire le test à nouveau et ça marche :
>cat fichier.txt
A
B
CD
E
F
>wc -l < fichier.txt
8
>sed '/^$/d' fichier.txt
A
B
C
D
E
F
>sed '/^$/d' fichier.txt|wc -l
6
donc si tu fais un echo $nb tu devrais voire afficher le nombre de paragraphe.
Note : pour réellement ne pas tenir compte des lignes (donc paragraphes) "vides", il serait plutôt préférable de faire :
sed '/^[[:blank:]]*$/d' fichier.txt|wc -l
EDIT : pour les 2 autres demandes :
* Compter le nombre de ponctuations dans un texte
* Compter le nombre de phrases dans un texte (en m'aidant de la ponctuation je pense)
...aides-toi de "Compter le nombre de lettres"... c'est exactement le même principe.
d'ailleurs, ça me fait penser qu'il n'est pas nécessaire de faire une boucle pour calculer le nombre moyen de phrase par paragraphe ...
Dernière modification par Totor (Le 12/09/2008, à 12:33)
-- Lucid Lynx --
Hors ligne
#18 Le 12/09/2008, à 12:43
- achara
Re : Questions d'un débutant (manipulation de texte)
Je refais ta manipulation point par point.
Cat nomdufichier.txt
---> le fichier texte s'affiche.
je fais >wc -l < fichier.txt
---> Usage: command-not-found [options] <nom-de-la-commande>
?
Hors ligne
#19 Le 12/09/2008, à 12:46
- Totor
Re : Questions d'un débutant (manipulation de texte)
Je ne connais que le bash. Il est possible que cette syntaxe ne fonctionne pas dans d'autres shell.
Es-tu en bash.
Pour contourner :
cat fichier.txt|wc -l
EDIT :
aurais-tu lancer wc -l < fichier.txt avec le > en début de ligne ???
si je mets >, c'est pour indiquer que c'est une ligne à taper et non une ligne de résultat !
Dernière modification par Totor (Le 12/09/2008, à 12:54)
-- Lucid Lynx --
Hors ligne
#20 Le 12/09/2008, à 12:56
- achara
Re : Questions d'un débutant (manipulation de texte)
oh mon dieu je commence à paniquer (me reste 4heures...) et j'ai pas fais gaffe
je te tiens au courant
Hors ligne
#21 Le 12/09/2008, à 12:59
- achara
Re : Questions d'un débutant (manipulation de texte)
Non, malheuresement ça ne fonctionne pas, je pense que c'est parceque le "-l" cherche le nombre de lignes et non pas de paragraphes, je trouve 102 à la place de 23 (comptés à la main on sait jamais...)
Là je séche complétement.
Hors ligne
#22 Le 12/09/2008, à 13:04
- iuchiban
Re : Questions d'un débutant (manipulation de texte)
>cat fichier.txt A B C D E F >wc -l < fichier.txt 8 >sed '/^$/d' fichier.txt A B C D E F >sed '/^$/d' fichier.txt|wc -l 6
nbParagraphe = 8-6+1 donc
nbligneavant=$(cat fichier.txt | wc -l)
sed '/^$/d' fichier.txt
nbligneapres=$(sed '/^$/d' fichier.txt|wc -l)
nbparagraphe=$(($nbligneavant-$nbligneapres+1))
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#23 Le 12/09/2008, à 13:06
- Totor
Re : Questions d'un débutant (manipulation de texte)
????
qu'appelles-tu "paragraphes" ?
est-ce :
1.
<phrase 1>.<phrase 2>.
<ligne vide>
<phrase 3>
ou
2.
<phrase 1>.<phrase 2>.<retour à la ligne>
<phrase 3>
Pour moi, c'est le cas 2.
Dernière modification par Totor (Le 12/09/2008, à 13:07)
-- Lucid Lynx --
Hors ligne
#24 Le 12/09/2008, à 13:10
- Totor
Re : Questions d'un débutant (manipulation de texte)
nbParagraphe = 8-6+1 donc
tu vois 7 lignes non vides dans le fichier ?
A=1ère
B=2nde
C=3ème
D=4ème
E=5ème
F=6ème
....
-- Lucid Lynx --
Hors ligne
#25 Le 12/09/2008, à 13:14
- achara
Re : Questions d'un débutant (manipulation de texte)
voici le fameux fichier en question (j'ai pris un discours au pif hein ) URL SUPPRIMEE
Les accents s'affichent correctement quand le fichier est lu par le shell ou un éditeur de texte.
Dernière modification par achara (Le 12/09/2008, à 14:52)
Hors ligne