[bash] traitements multiples sur un fichier
Résolu
Bonjour,
Je dois réaliser un script qui effectue plusieurs opération de traitement sur un fichier.txt
Je dois tout d'abord rechercher son encodage, et s'il n'est pas en utf-8 le convertir. Puis je dois segmenter mon corpus en mots, pour ensuite effectuer un calcul d'occurrences des mots, dont le résultat doit être présenter par ordre de fréquence décroissante.
Voici mon script :
#!/bin/bash
echo " Donnez le nom du corpus: " ;
read corpus ;
#----------------------------------
encodage=$(file -i corpus-test.txt) ;#détermine l'encodage du texte
iconv -f $encodage -t utf-8 corpus-test.txt > corpus-test.u8 ;#si l'encodage n'est pas en utf-8, je le converti en utf-8 et change son nom
#----------------------------------
sed -e 's/^[ \t]*//;s/[ \t]*$//' corpus-test.u8 > corpus-test.tok ;#segmentation du texte
sort | uniq -c \ | sort -rg < corpus-test.tok > corpus-test.tok.freq ;#calcul de la fréquence et trie par ordre décroissant
seulement lorsque j'exécute mon script sous cygwin, les erreurs suivantes apparaissent :
- iconv : conversion from corpus-test.txt : unsupported
- iconv : try 'iconv -l' to get the list of supported encodings
- uniq : : No such file or directory
Je ne comprends pas d'où viennent ces erreurs.
Est ce que quelqu'un pourrait m'expliquer svp ?
Merci :)
Je dois réaliser un script qui effectue plusieurs opération de traitement sur un fichier.txt
Je dois tout d'abord rechercher son encodage, et s'il n'est pas en utf-8 le convertir. Puis je dois segmenter mon corpus en mots, pour ensuite effectuer un calcul d'occurrences des mots, dont le résultat doit être présenter par ordre de fréquence décroissante.
Voici mon script :
#!/bin/bash
echo " Donnez le nom du corpus: " ;
read corpus ;
#----------------------------------
encodage=$(file -i corpus-test.txt) ;#détermine l'encodage du texte
iconv -f $encodage -t utf-8 corpus-test.txt > corpus-test.u8 ;#si l'encodage n'est pas en utf-8, je le converti en utf-8 et change son nom
#----------------------------------
sed -e 's/^[ \t]*//;s/[ \t]*$//' corpus-test.u8 > corpus-test.tok ;#segmentation du texte
sort | uniq -c \ | sort -rg < corpus-test.tok > corpus-test.tok.freq ;#calcul de la fréquence et trie par ordre décroissant
seulement lorsque j'exécute mon script sous cygwin, les erreurs suivantes apparaissent :
- iconv : conversion from corpus-test.txt : unsupported
- iconv : try 'iconv -l' to get the list of supported encodings
- uniq : : No such file or directory
Je ne comprends pas d'où viennent ces erreurs.
Est ce que quelqu'un pourrait m'expliquer svp ?
Merci :)
4 réponses
-
Merci beaucoup à vous tous pour toutes vos réponses. J'ai réussi à avoir ce que je voulais. J'avais oublié un | dans mon script et c'est pour ça que tout était chamboulé. Je pensais pourtant m'être bien relue ^^
-
ModérateurRe,
:~$ cat plop 1835 1812 1693 1692 1587 1566 1531 1499 1465 89 74 29 23 23 23 20 19 17 16 4 3 2° 1° 1er 1er ôtée ôtait îles îles îles îles île île être être être être être être être être être être être être être être être être être être être :~$ perl -ne '$h{$_}++;END{for $e(reverse sort {$h{$a} <=> $h{$b}}keys %h){print "$h{$e} $e"}}' plop 19 être 4 îles 3 23 2 île 2 1er 1 1465 1 1812 1 3 1 1499 1 1587 1 1566 1 17 1 ôtée 1 1° 1 ôtait 1 1692 1 20 1 1693 1 1835 1 89 1 29 1 16 1 74 1 2° 1 4 1 1531 1 19 :~$ -
ModérateurSalut,
C'est obligatoire en bash?
-
Bonjour,
Qu'est ce que ça donne si tu essaye :
#!/bin/bash
echo " Donnez le nom du corpus: " ;
read corpus ;
#----------------------------------
encodage=$(file -i corpus-test.txt)
#détermine l'encodage du texte
iconv -f $encodage -t UTF-8 corpus-test.txt > corpus-test.u8
#si l'encodage n'est pas en utf-8, je le converti en utf-8 et change son nom
#----------------------------------
sed -e 's/^[ \t]*//;s/[ \t]*$//' corpus-test.u8 > corpus-test.tok
#segmentation du texte
sort < corpus-test.tok | uniq -c \ | sort -rg > corpus-test.tok.freq
#calcul de la fréquence et trie par ordre décroissant
-
-
-
-
@ laoshu :
J'ai toujours le même problème avec uniq. Mais peut-être est ce lié à mon fichier corpus-test.tok. En effet je suis censé avoir une segmentation du texte par mots pourtant il n'y a aucune différence entre mon fichier texte et ce fichier :/ Je ne vois pas la segmentation.
Peut être devrais-je effectuer ma segmentation en remplaçant les espaces par un retour à la ligne pour que la commande uniq fonctionne ?
J'ai essayé avec cette commande :
perl -pe 's/[[ :punct :]]+/ $& /g' \ | tr -s '[ :space :]' '[\n*]' \ < corpus-test.u8 > corpus-test.tok
mais rien ne se passe, et lorsque je lance le script sous cygwin j'ai les messages d'erreurs suivants :
- Can't open : No such file or directory
tr : extra operand ' '
try 'tr --help' for more information
uniq : No such file or directory -
J'essaye,
Si je me trompe et que tu as de la chance, Zipe corrigeras...
file -i corpus.txt
revoie une ligne :
corpus.txt: text...; charset=[ce que tu cherches]
/*=/ permet de n'avoir que la partie qui suit le '=' donc (ici) ce que tu cherches
Avec une question pour notre correcteur, juste pour savoir s'il a lu ou non...
encodage=$(file -i corpus-test.txt | cut -d= -f2 )
cela aurait eu le même effet ?
-