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

Applications et environnements graphiques Discussion :

shell sort numérique


Sujet :

Applications et environnements graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 shell sort numérique
    Bonjour et au secours,

    je cherche depuis plusieurs heures et n'arrive pas à trouver comment faire un tri numérique

    Je voudrais trier par ordre croissant les entiers des 2 premières colonnes (séparées par des virgules):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # cat toto
    1,1
    1,4
    1,2
    1,3
    1,5
    1,6
    1,8
    1,10
    1,9
    2,2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # cat toto | sort --field-separator=',' -n -k 1,2
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,8
    1,9
    2,2
    1,10
    Je voudrais notamment sortir "1,10" avant "2,2" !!!

    Oumgourje?

    J'utilise une version assez ancienne (RedHat 3), sans particularité linguistique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # sort --version
    sort (coreutils) 4.5.3
    Written by Mike Haertel and Paul Eggert.
     
    Copyright (C) 2002 Free Software Foundation, Inc.
     
    # env | fgrep --color=auto LC | wc -l
          0
    Merci d'avance

    )jack(

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    c'est parce que tu trie l'ensemble des colonnes 1 et 2 que le résultat est bizare.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort --field-separator="," -n k 1,1 fichier
    sort bien le 1,10 avant 2,2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1,10
    1,2
    2,2
    2,3
    vires ton cat inutile pour voir si c'est pas lui qui provoque un problème d'interprétation ...

  3. #3
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Il faut définir les 2 clés séparément :
    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
    $ cat toto.sort
    1,1
    1,4
    1,2
    1,3
    1,5
    1,6
    1,8
    1,10
    1,9
    2,2
    $ sort -t',' -n -k1,1 -k2,2 toto.sort
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,8
    1,9
    1,10
    2,2
    (première clé = premier champ, deuxième clé = deuxième champ)

    Edit : pour être précis, si tu fais -k1, alors il prend la clé de la position 1 jusqu'à la fin de la ligne, si tu fais -k1,2 alors la clé contient les positions 1 et 2 ensemble, et j'ai l'impression qu'avec -n sort ignore tout simplement les caractères non numériques : 2,2 devient 22 et 1,7 devient 17 etc comme on le voit ici :

    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 toto.sort
    1,1
    1,a
    19
    1,8
    1,10
    17
    2,2
    $ sort -t',' -nk1 toto.sort
    1,a
    1,1
    17
    1,8
    19
    2,2
    1,10

  4. #4
    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
    Citation Envoyé par Alek-C Voir le message
    Il faut définir les 2 clés séparément :
    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
    $ cat toto.sort
    1,1
    1,4
    1,2
    1,3
    1,5
    1,6
    1,8
    1,10
    1,9
    2,2
    $ sort -t',' -n -k1,1 -k2,2 toto.sort
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,8
    1,9
    1,10
    2,2
    (première clé = premier champ, deuxième clé = deuxième champ)
    Ah! D'accord! Je demande une première clé qui commence au premier champ et finit au premier champ (-k1,1), bref qui contient juste le premier champ, puis une deuxième clé qui commence au deuxième champ et finit au deuxième champ (-k2,2). Capico!

    Et ça marche!

    Merci beaucoup!

    J'ai cru que j'allais devenir chèvre, si ce n'était déjà fait...

    )jack(

  5. #5
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    le cat faut le virer de toute façon, non pas parce que ca perturbe mais parce que c'est inutile et que l'pipe abusif .... etc...Etc.... on va pas revenir sur l'UUoC

  6. #6
    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
    Citation Envoyé par frp31 Voir le message
    le cat faut le virer de toute façon, non pas parce que ca perturbe mais parce que c'est inutile et que l'pipe abusif .... etc...Etc.... on va pas revenir sur l'UUoC
    Euh... je crois que je n'ai pas été assez clair pour me faire comprendre, désolé.

    Le "cat" que j'ai mis ici, c'était juste pour un exemple.

  7. #7
    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
    Bon, ben déjà, merci d'avoir répondu aussi rapidement!

    Citation Envoyé par frp31 Voir le message
    c'est parce que tu trie l'ensemble des colonnes 1 et 2 que le résultat est bizarre.
    Mais, c'est précisément ce que je veux!

    Je veux un tri majeur sur la première colonne et, lorsque la première ne discrimine pas, c'est-à-dire lorsque les valeurs de la première colonne sont identiques, je veux un tri sur la 2ème colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort --field-separator="," -n k 1,1 fichier
    sort bien le 1,10 avant 2,2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1,10
    1,2
    2,2
    2,3
    Ben, j'aimerais ben, mais ça l'fait point!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # sort -n -k 1,1 toto
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,8
    1,9
    2,2
    1,10
    vires ton cat inutile pour voir si c'est pas lui qui provoque un problème d'interprétation ...
    Désolé, mais je ne peux même pas imaginer que cela fasse la moindre différence!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # man sort
    SYNOPSIS
           sort [OPTION]... [FILE]...
     
    DESCRIPTION
           Write sorted concatenation of all FILE(s) to standard output.
    D'après le man, les fichiers sont bien optionnels et probablement concaténés avant le tri.

    Et, en plus, dans mon code, ce ne serait pas bienvenu car le pseudo fichier "toto" est la sortie d'un pipe que je veux justement trier en mémoire avant de le stocker dans un fichier (bon, d'accord, ce ne serait pas un gros fichier et je pourrais le supprimer ensuite (mais, de toute façon, ça ne change rien au résultat!)).

    Entre-temps, j'ai continué mes investigations et penche plutôt pour un problème linguistique, car si je remplace la virgule par un autre séparateur, comme une virgule suivie d'une espace ou un simple point-virgule, ça marche enfin!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # cat toto | sed -e 's:,:;:' | sort --field-separator=';' -n -k 1 -n -k 2 | sed -e 's:;:,:'
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,8
    1,9
    1,10
    2,2
    Et pourtant, je n'ai aucune variable LC positionnée, ni rien qui pourrait faire penser à un environnement français!?!

    Au moins, j'ai un contournement qui marche! si personne ne trouve mieux...

    )jack(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Commande SHELL sort en vb.net
    Par jojo1284 dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2010, 14h24
  2. Shell : la commande sort + filtres
    Par SHAD777 dans le forum AIX
    Réponses: 5
    Dernier message: 26/11/2008, 14h56
  3. trier un fichier particulier command sort shell
    Par Mistervanhalen dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/06/2008, 18h56
  4. le contraire de sort (shell) ou bsort (C)
    Par TabrisLeFol dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 02/02/2007, 11h31

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