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 :

Tri alphabétique puis numérique


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 Tri alphabétique puis numérique
    Bonjour à tous,

    Je sais que déjà plein de personnes ont eu le même souci et j'ai trouvé plein de réponses sur internet mais elles ne correspondent pas exactement à ce que je veux.
    J'ai un petit batch qui liste mes jeux de Wii.
    Il les trient pas ordre alphabétique tel que par exemple (certains jeux n'existent pas mais c'est pour l"exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Just Dance 2
    Just Dance 2014
    Just Dance 4
    ...
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    ...
    Tout ça pour dire que j'avait réussi à trier en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat txt | sort -k 1,1 -k 2,2n
    Le souci c'est que si j'ai bien compris, il trie numériquement la deuxième colonne mais dans ce cas, ce sera bon pour "Just Dance" mais pas pour "Asterix aux Jeux Olympiques D'hiver".
    Y'a t-il un moyen intelligent de le faire trier uniquement sur une colonne numérique comme dans mon cas ?

    Merci

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gawk '{a[$0]=$0}END{PROCINFO["sorted_in"]="@ind_num_asc"; for(i in a) print a[i]}' fichier.in 
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    Just Dance 2
    Just Dance 2014
    Just Dance 4
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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 ta réponse mais je n'ai pas préciser c'est vrai.
    Le résultat que j'aimerai avoir est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 8
    Asterix aux Jeux Olympiques D'hiver 2013
    Just Dance 2
    Just Dance 4
    Just Dance 2014

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{a[$0]=$0}END{PROCINFO["sorted_in"]="@ind_num_asc"; for(i in a) print a[i]}' fichier.in
    Euh... un simple sort fichier fait la même chose

    C'est le comportement par défaut de la commande sort il me semble, tri alphabétique puis numérique, non ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    la commande awk donnée ne trie effectivement pas numériquement
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par lokomass Voir le message
    Merci pour ta réponse mais je n'ai pas préciser c'est vrai.
    Le résultat que j'aimerai avoir est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 8
    Asterix aux Jeux Olympiques D'hiver 2013
    Just Dance 2
    Just Dance 4
    Just Dance 2014

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bash-3.2$ cat txt | sort -V
    sort: invalid option -- V
    Try `sort --help' for more information.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bash-3.2$ cat txt | sort
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    Just Dance 2
    Just Dance 2014
    Just Dance 4
    Mon tri actuel est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bash-3.2$ cat txt | sort -fk 1,1
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    Just Dance 2
    Just Dance 2014
    Just Dance 4

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Bonjour

    Ta méthode du premier post était bonne mais le champ 2 n'est pas celui que tu crois.
    Tu confonds le champ 2 et le dernier champ.

    La proposition suivante change les espaces en tirets bas pour faire le tri classique, puis enlève les tirets:

    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
    $ cat games.txt 
    Asterix aux Jeux Olympiques
    Just Dance 2014
    Fou2foot 4
    Fou2foot 2013
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    ...
    Just Dance 2
    Just Dance 4
    $ sed 's/[ 0-9]*$/;&/;s/ /_/g;s/;_/ /;s/;//' games.txt|sort -k1,1 -k2,2n |sed 's/_/ /g'
    ...
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 8
    Asterix aux Jeux Olympiques D'hiver 2013
    Fou2foot 4
    Fou2foot 2013
    Just Dance 2
    Just Dance 4
    Just Dance 2014
    $

  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
    Merci beaucoup pour ton aide.
    Une question peut-être bête mais il est aussi possible que j'ai des titres qui commencent par des chiffres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1000 Fraises
    3 Abricots
    31 Totos
    =>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    3 Abricots
    31 Totos
    1000 Fraises
    J'aimerai que ça puisse aussi trier dans ce sens. C'est faisable ?

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Bonjour,
    zipe31 a donné la meilleur solution, ne pourrais tu installer une version plus récente de sort (qui possède l'option -V qui est le tri naturel avec prise en compte des nombre dans le texte ?
    exemple:
    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
    $ cat games.txt
    Asterix aux Jeux Olympiques
    Just Dance 2014
    Fou2foot 4
    Fou2foot 2013
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 2013
    Asterix aux Jeux Olympiques D'hiver 8
    Just Dance 2
    Just Dance 4
    3 Abricots
    31 Totos
    1000 Fraises
    1000 Fraises 2
    1000 Fraises 2014
    1000 Fraises 4
    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
    $ sort -V games.txt
    3 Abricots
    31 Totos
    1000 Fraises
    1000 Fraises 2
    1000 Fraises 4
    1000 Fraises 2014
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 8
    Asterix aux Jeux Olympiques D'hiver 2013
    Fou2foot 4
    Fou2foot 2013
    Just Dance 2
    Just Dance 4
    Just Dance 2014

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Sinon, voici une solution:
    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
    $ awk '{for (i=1;i<=NF;i++) {if ($i ~ /\<[0-9]*\>/) {$i=sprintf("%050d",$i)}} print}' games.txt | sort | sed 's/\(\(^\)0*\|\( \)0*\)/\2\3/g'
    3 Abricots
    31 Totos
    1000 Fraises
    1000 Fraises 2
    1000 Fraises 4
    1000 Fraises 2014
    Asterix aux Jeux Olympiques
    Asterix aux Jeux Olympiques D'hiver 2
    Asterix aux Jeux Olympiques D'hiver 8
    Asterix aux Jeux Olympiques D'hiver 2013
    Fou2foot 4
    Fou2foot 2013
    Just Dance 2
    Just Dance 4
    Just Dance 2014

Discussions similaires

  1. Tri alphabétique sur plusieurs champs
    Par lamoufle dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/12/2005, 04h26
  2. [VC++6][MFC]Tri alphabétique dans CEdit
    Par ben_popcorn dans le forum MFC
    Réponses: 5
    Dernier message: 03/10/2005, 09h39
  3. [ListView] tri particulier (comparaison numérique)
    Par Cybher dans le forum C++Builder
    Réponses: 16
    Dernier message: 28/07/2005, 14h12
  4. [JTable] tri alphabétique
    Par clairette dans le forum Composants
    Réponses: 1
    Dernier message: 27/07/2005, 11h09
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38

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