[bash] traitements multiples sur un fichier
Résolu
Utilisateur anonyme
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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 :)
A voir également:
- [bash] traitements multiples sur un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
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
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
Re,
:~$ 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 :~$
Devrait aller mieux ;-))
je ferai bien de trouver un exemplaire du livre dont tu parlais...
Peux-tu m'expliquer à quoi cela correspond stp ? J'imagine qu'il s'agit d'expressions régulières mais je n'arrive pas à les interpréter :/
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
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 ?