IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Sort avec accents


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut Sort avec accents
    Bonjour,

    Ma question est simple.
    J'ai plusieurs fichiers, certains ont des accents, j'aimerais les afficher par ordre alphabétique.

    Actuellement je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ls | sort --ignore-case
    Brice
    Florian
    Francis
    Félicien
    J'aimerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ls | sort --ignore-case
    Brice
    Félicien
    Florian
    Francis
    Comment faire, sachant que je ne veux pas supprimer les accents ?

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    La réponse est dans la question. La commande que tu cites marche très bien chez moi

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Bonjour,

    bash fait ça très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ touch Brice Florian Félicien Francis
    $ printf '%s\n' *
    Brice
    Félicien
    Florian
    Francis
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Chez moi ça ne marche pas à priori comment est-ce possible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bash-3.2# printf '%s\n' *
    Brice
    Florian
    Francis
    Félicien

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    je ne sais pas.

    les fichiers ont été créés sur linux, ou bien sont-ils sur une partition windows ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Bonjour,

    La raison, est sur ta locale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $ locale
    LANG=C.utf8
    LC_CTYPE="C.utf8"
    LC_NUMERIC="C.utf8"
    LC_TIME="C.utf8"
    LC_COLLATE="C.utf8"
    LC_MONETARY="C.utf8"
    LC_MESSAGES="C.utf8"
    LC_ALL=
    $ ls | sort
    Brice
    Florian
    Francis
    Félicien
    $ export LANG=fr_FR.utf8
    $ ls | sort
    Brice
    Félicien
    Florian
    Francis
    $ locale
    LANG=fr_FR.utf8
    LC_CTYPE="fr_FR.utf8"
    LC_NUMERIC="fr_FR.utf8"
    LC_TIME="fr_FR.utf8"
    LC_COLLATE="fr_FR.utf8"
    LC_MONETARY="fr_FR.utf8"
    LC_MESSAGES="fr_FR.utf8"
    LC_ALL=

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    En fait mon serveur est un NAS synology initialement en ash.
    J'ai donc installé le paquet bash dessus.
    Sous ash, je peux créer un fichier "Félicien", sous bash je ne peux même pas taper de caractère accentué.
    Si je tape locale, que ce soit sous ash ou bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bash-3.2# locale
    bash: locale: command not found

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Pas grave, lit la correction de mon post précédent.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Toujours pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    bash-3.2# cd /tmp/test/
    bash-3.2# ls | sort
    Brice
    Florian
    Francis
    Félicien
    bash-3.2# export LANG=fr_FR.utf8
    bash-3.2# ls | sort
    Brice
    Florian
    Francis
    Félicien
    bash-3.2# locale
    bash: locale: command not found
    bash-3.2#

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Sur une petite recherche sur g00gle, j'ai trouver ce lien (en anglais), de quelqu'un qui à le même problème sur les accents (en fait la locale) et explique comment l'installer:
    http://www.xn--brwolff-5wa.de/tech-n...set-locale.txt

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Merci pour ton aide, mais le souci c'est que même si sous ash ça marcherai, c'est sous /bin/bash que le problème se pose, d'autant plus que ce sont des fichiers Windows en question.
    N'y aurait-il pas une solution sur sort ?
    Merci

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    A part réinventer la roue...
    Si on regarde le man de sort, on a ceci:
    *** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte
    values.
    Qui est exactement ton problème, car les caractères accentués sont numériquement supérieurs et ce que tu sois en bash ou en ash.

  13. #13
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    fonctionne chez moi

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Le sort -d marche mieux, mais bizarre quand même !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bash-3.2# ls | sort -df
    Brice
    Félicien
    Florian
    Fénec
    Francis
    [EDIT] En fait je pense que l'option "-d" ne prend pas en compte la lettre accentué.

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    J'ai réussi à créer une fonction bidouille qui trie ma liste comme si il n'y avait pas d'accents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bash-3.2$ ls *.contact | sort
    Félicien.contact
    Florence.contact
    Fénéc.contact
    Francis.contact
    FT Moi.contact
    bash-3.2$ ./t.sh
    Félicien.contact
    Fénéc.contact
    Florence.contact
    Francis.contact
    FT Moi.contact
    Voici la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #!/bin/bash
     
    #Fonction qui trie une liste par ordre alphabétique en prenant en compte les accents
    function trieAccents
    {
    	rm -f "LISTE"*
    	for i in $*
    	do
    		echo "$i" | sed "s/à/#a/g" | sed "s/â/#aa/g" | sed "s/ç/#c/g" | sed "s/é/#e/g" | sed "s/è/#ee/g" | sed "s/ê/#eee/g" | sed "s/ë/#eeee/g" | sed "s/î/#i/g" | sed "s/ï/#ii/g" | sed "s/ô/#o/g" | sed "s/ö/#oo/g" | sed "s/ù/#u/g" | sed "s/ü/#uu/g" | sed "s/Â/#A/g" | sed "s/À/#AA/g" | sed "s/Ç/#C/g" | sed "s/É/#E/g" | sed "s/È/#EE/g" | sed "s/Ê/#EEE/g" | sed "s/Ë/#EEEE/g" | sed "s/Î/#I/g" | sed "s/Ï/#II/g" | sed "s/Ô/#O/g" | sed "s/Ö/#OO/g" | sed "s/Ù/#U/g" | sed "s/Ü/#UU/g" >> "LISTE1"
    	done
    	cat "LISTE1" | sort --ignore-case >> "LISTE2"
    	cat "LISTE2" | while read LIGNE
    	do
    		echo "$LIGNE" | sed "s/#a/à/g" | sed "s/#aa/â/g" | sed "s/#c/ç/g" | sed "s/#e/é/g" | sed "s/#ee/è/g" | sed "s/#eee/ê/g" | sed "s/#eeee/ë/g" | sed "s/#i/î/g" | sed "s/#ii/ï/g" | sed "s/#o/ô/g" | sed "s/#oo/ö/g" | sed "s/#u/ù/g" | sed "s/#uu/ü/g" | sed "s/#A/Â/g" | sed "s/#AA/À/g" | sed "s/#C/Ç/g" | sed "s/#E/É/g" | sed "s/#EE/È/g" | sed "s/#EEE/Ê/g" | sed "s/#EEEE/Ë/g" | sed "s/#I/Î/g" | sed "s/#II/Ï/g" | sed "s/#O/Ô/g" | sed "s/#OO/Ö/g" | sed "s/#U/Ù/g" | sed "s/#UU/Ü/g" >> "LISTE3"
    	done
    }
     
     
    REPCON=.
    export IFS=""
    trieAccents `ls "$REPCON"/*.contact | awk -F'/' '{print $NF}'`
     
    cat "LISTE3"
    Vous en pensez quoi ?
    Je sais c'est grosse bidouille mais fonctionnel !

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Tant que tu n'as pas des fichiers qui se nomme toto#aa.txt par exemple...

  17. #17
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Ouais voilà
    En fait ce sont tous mes contacts iPhone, donc non aucun nom de ce type, juste des espaces et des accents.
    Après j'aurai bien aimé écrire la fonction qui renvoi juste la liste sans créer aucun fichier mais je sais pas faire

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Voici la fonction (légèrement corrigée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function trieAccents {
        echo "$@" | sed -e "s/à/#a/g" -e "s/â/#aa/g" -e "s/ç/#c/g" -e "s/é/#e/g" -e "s/è/#ee/g" -e "s/ê/#eee/g" -e "s/ë/#eeee/g" -e "s/î/#i/g" -e "s/ï/#ii/g" -e "s/ô/#o/g" -e "s/ö/#oo/g" -e "s/ù/#u/g" -e "s/ü/#uu/g" -e "s/Â/#A/g" -e "s/À/#AA/g" -e "s/Ç/#C/g" -e "s/É/#E/g" -e "s/È/#EE/g" -e "s/Ê/#EEE/g" -e "s/Ë/#EEEE/g" -e "s/Î/#I/g" -e "s/Ï/#II/g" -e "s/Ô/#O/g" -e "s/Ö/#OO/g" -e "s/Ù/#U/g" -e "s/Ü/#UU/g" \
            | tr ' ' '\n' | sort --ignore-case \
            | sed -e "s/#aa/â/g" -e "s/#a/à/g" -e "s/#c/ç/g" -e "s/#eeee/ë/g" -e "s/#eee/ê/g" -e "s/#ee/è/g" -e "s/#e/é/g" -e "s/#ii/ï/g" -e "s/#i/î/g" -e "s/#oo/ö/g" -e "s/#o/ô/g" -e "s/#uu/ü/g" -e "s/#u/ù/g" -e "s/#AA/À/g" -e "s/#A/Â/g" -e "s/#C/Ç/g" -e "s/#EEEE/Ë/g" -e "s/#EEE/Ê/g" -e "s/#EE/È/g" -e "s/#E/É/g" -e "s/#II/Ï/g" -e "s/#I/Î/g" -e "s/#OO/Ö/g" -e "s/#O/Ô/g" -e "s/#UU/Ü/g" -e "s/#U/Ù/g"
    }
    Si on fait un seul 'sed', c'est beaucoup beaucoup plus efficace.
    De plus, avec ton algo, il faut permuter les substitutions inverses, sinon le remplacement de #ee par ée intervient avant que le remplacement par è ait eu la possibilité de s'effectuer...

    mais, comme tu ajoutes des lettres, il y a un effet de bord malencontreux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ trieAccents leba leho léa léco légo lémo lèa lèbi lèca lèculéa
    leba
    léco
    lèa
    lèbi
    lèca
    lècu
    légo
    leho
    lémo

  19. #19
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Ah mince
    En effet ta fonction est vachement plus efficace...
    On est obliger de subir cet effet ? La seule solution que j'ai trouver pour changer un caractère accentué en non accentué c'est de faire ça, mais y'a peut être d'autre solutions !?
    Merci en tout cas

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Il est vrai que c'est faisable en une seul ligne du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s\n" * | sed 's/à/#a/g;s/é/#e/g;....' | sort ....| sed ...
    Après, le printf, tu peux le remplacer par ta commande awk (mais évite le ls, car tu vas fâcher des gens )

    Si tu regardes bien la syntaxe du sed que je t'ai donné, tu verras qu'en un seul sed, tu peux tout modifié dans un sens.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [SYBASE] Texte avec accents
    Par vsavoir dans le forum Sybase
    Réponses: 6
    Dernier message: 14/02/2005, 16h50
  2. [XSL] xsl:sort avec parametre et condition
    Par elraton dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/01/2005, 20h59
  3. [JavaMail] Pb avec accent dans sujet et corps de l'email
    Par shaun_the_sheep dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/10/2004, 12h42
  4. Problème avec accents et CHARACTER SET ISO8859_1
    Par kinda dans le forum InterBase
    Réponses: 13
    Dernier message: 30/10/2003, 15h49
  5. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo