[bash] traitements multiples sur un fichier

Résolu
hakkio -  
lami20j Messages postés 21506 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 :)

4 réponses

  1. laoshu Messages postés 1251 Statut Membre 351
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

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

      Devrait aller mieux ;-))
      0
    2. laoshu Messages postés 1251 Statut Membre 351
       
      Encore merci zipe !

      je ferai bien de trouver un exemplaire du livre dont tu parlais...
      0
    3. hakkio
       
      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
    4. hakkio
       
      @ 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
    5. laoshu Messages postés 1251 Statut Membre 351
       
      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
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    C'est obligatoire en bash?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      Ok, merci ;-)
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. hakkio
     
    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
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

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