[bash] traitements multiples sur un fichier

Résolu/Fermé
Utilisateur anonyme - 9 juin 2011 à 15:51
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 9 juin 2011 à 20:37
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 :)

A voir également:

4 réponses

laoshu Messages postés 1231 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 24 mai 2015 350
9 juin 2011 à 16:40
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

1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
9 juin 2011 à 16:48
Salut,

iconv -f ${encodage/*=/} -t UTF-8 corpus-test.txt > corpus-test.u8

Devrait aller mieux ;-))
0
laoshu Messages postés 1231 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 24 mai 2015 350
9 juin 2011 à 17:02
Encore merci zipe !

je ferai bien de trouver un exemplaire du livre dont tu parlais...
0
Utilisateur anonyme
9 juin 2011 à 17:04
Oui merci c'est mieux avec ${encodage/*=/}.

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 :/
0
Utilisateur anonyme
9 juin 2011 à 17:19
@ 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
0
laoshu Messages postés 1231 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 24 mai 2015 350
9 juin 2011 à 17:23
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 ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
9 juin 2011 à 19:28
Salut,

C'est obligatoire en bash?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
9 juin 2011 à 19:32
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
9 juin 2011 à 19:34
Re,

Ok, merci ;-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
9 juin 2011 à 19:53
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
:~$ 
0
Utilisateur anonyme
9 juin 2011 à 20:31
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 ^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
9 juin 2011 à 20:37
Re,

Tant mieux ;-)
Tu peux mettre le sujet en résolu.
0