[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 :)

4 réponses

  1. 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. Contributeur
      Salut,

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

      Devrait aller mieux ;-))
      0
    2. Encore merci zipe !

      je ferai bien de trouver un exemplaire du livre dont tu parlais...
      0
    3. 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. @ 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. 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. Modérateur
    Salut,

    C'est obligatoire en bash?
    0
    1. Modérateur
      Re,

      Ok, merci ;-)
      0
  3. Modérateur
    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
    1. 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. Modérateur
        Re,

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

    Discussions similaires

    question pix mot caché

    7 réponses