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 délimiteur


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 délimiteur
    Bonjour,

    Je veux trier une liste qui contient des "#" en ignorant ce qu'il y a derrière...

    Du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    Banane#436
    Fraise#8875
    Kiwi#432
    Orange#
    ...
    J'ai pensé faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat fichier | cut -d "# -f1 | sort -k 1,1 .....
    Il me trie bien dans l'ordre que je veux...
    Mais le souci c'est qu'a la fin j'ai perdu le -f2, et j'aimerai le reconcaténer après le tri.

    Donc comment faire ?
    Merci d'avance

  2. #2
    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,

    sort utilise le tri alphabétique par défaut, donc un simple sort fichier devrait suffire, non ?

    Sinon on peut spécifier le délimiteur de son choix avec l'option "-t"

  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 bizarement l'option "sort -t#" et l'option "cat | cut ... | sort" ne me renvoyent pas exactement la même chose

  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
    Tu as un exemple concret à nous soumettre s'il te plaît ?

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Par défaut
    Citation Envoyé par lokomass Voir le message
    Merci pour ta réponse mais bizarement l'option "sort -t#" et l'option "cat | cut ... | sort" ne me renvoyent pas exactement la même chose
    Pour répondre à ton problème de tri, je dirai que tu n'as que ça à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | sort -t'#' -k1,1
    qui va trier ton fichier suivant la première colonne délimitée par un '#'.

    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | cut ... | sort ...
    tu coupes l'affichage pour n'avoir plus que la colonne sélectionné, et donc le 'sort' qui vient après n'a plus que cette colonne à 'manger'.
    cat -> affiche le fichier en entier
    cut -> découpe suivant le délimiteur envoyé et affiche la ou les colonnes sélectionnée(s)
    sort -> tri le résultat du cut avec ce qu'il reste.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 405
    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 405
    Par défaut
    Bonjour,

    Juste une question comme ça, pourquoi utiliser "cat", "cut fichier" ou "sort fichier", ne fonctionne plus ?

  7. #7
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    La commande qui devrait bien fonctionner est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t '#' -k 1,1 fichier
    Il faut cependant faire attention à la variable d'environnement LC_COLLATE que je force personnellement à "C". Pour le faire, ça dépend de la distribution.
    Fichier source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    banane#1
    kiwi#2
    orange#3
    Pomme#4
    ananas#5
    kaki#6
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pomme#4
    ananas#5
    banane#1
    kaki#6
    kiwi#2
    orange#3

  8. #8
    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 jmelyn Voir le message
    La commande qui devrait bien fonctionner est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t '#' -k 1,1 fichier
    Il faut cependant faire attention à la variable d'environnement LC_COLLATE que je force personnellement à "C"
    Je persiste et je signe, le délimiteur ne sert à rien, par défaut "sort" trie par ordre alphabétique

    En reprenant ton exemple (faute d'exemple concret demandé plus haut ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat plop
    banane#1
    kiwi#2
    orange#3
    Pomme#4
    ananas#5
    kaki#6
    Un sort simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ LC_COLLATE=C  sort  plop
    Pomme#4
    ananas#5
    banane#1
    kaki#6
    kiwi#2
    orange#3
    Un sort avec délimiteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ LC_COLLATE=C  sort -t'#' -k 1,1 plop
    Pomme#4
    ananas#5
    banane#1
    kaki#6
    kiwi#2
    orange#3

  9. #9
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Voici un contre-exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat fichier.txt
    a#123
    a #456
    $ sort -t '#' -k 1,1 fichier.txt
    a#123
    a #456
    $ sort fichier.txt
    a #456
    a#123
    Le point important est de savoir si le code ASCII du délimiteur est plus petit que tous les autres caractères des champs. En l'occurence ici le code de l'espace (32) est plus petit que celui du dièse (35). Même résultat avec '!' (33) et '"' (34).

  10. #10
    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
    Merci pour ce contre-exemple fort instructif qui plus est

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    2 remarques:
    • Pourquoi -k1,1? C'est inutile. Tu dis de trier selon la colonne 1 puis la colonne1. -k1 suffit
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sort -t'#' -k1 fichier.txt
    • Miam.
      LC_COLLATE que je force personnellement à "C"
      . Ton exemple n'a pas d'accents. Je voudrais être petite souris pour te voir arracher tes beaux cheveux dans le vent quand tu voudras que soit triés naturellement é è à

  12. #12
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour Flodelarab,

    Option k 1,1
    sort -k 1 veut dire 'trier les lignes suivant le champ1, puis suivant le champ2, puis suivant le champ3... jusqu'au dernier champ'. Alors que sort -k 1,1 veut dire 'trier les lignes suivant le champ1', en fait du champ1 au champ1. Voir la man-page. Lorsqu'il y a des dizaines de milliers de lignes contenant des dizaines de champs, la différence en temps de calcul est tout à fait notable.

    LC_COLLATE="C"
    Pour moi, il est plus important de faire la différence entre majuscule et minuscule que de prendre en compte les lettres accentuées.

    'Je voudrais être petite souris pour te voir arracher tes beaux cheveux dans le vent'.
    Hors sujet, inapproprié.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    L'idée selon laquelle le reste n'est pas trié est fausse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat fichier.txt 
    toto titi tata tutu
    toto tata tutu titi
    titi titi titi titi
    titi tata tata tata
    tata tata tata toto
    $ sort -k1,1 fichier.txt 
    tata tata tata toto
    titi tata tata tata
    titi titi titi titi
    toto tata tutu titi
    toto titi tata tutu
    C'est même pire pour des champs autre que 1. Quand on le laisse aller jusqu'à la fin, il trie moins de champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sort -k2 fichier.txt 
    titi tata tata tata
    tata tata tata toto
    toto tata tutu titi
    toto titi tata tutu
    titi titi titi titi
    $ sort -k2,2 fichier.txt 
    tata tata tata toto
    titi tata tata tata
    toto tata tutu titi
    titi titi titi titi
    toto titi tata tutu
    Dans le premier cas il trie 2,3,4. Dans le second cas il trie 2,1,3,4.

  14. #14
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour Flodelarab,

    Tu as raison, et j'ai dû me replonger dans les tests pour comprendre. Ce qui en ressort c'est que pour faire ce que j'ai dit il manque l'option --stable, sinon les autres champs sont triés comme tu l'as indiqué. J'ai vérifié (sur des fichiers monstrueux) que le temps pris était légèrement plus court avec un seul champ à trier. La man-page est vraiment peu explicite au sujet de cette option.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t'#' -k 1,1 --stable fichier.txt
    Merci pour avoir soulevé le sujet. Si tu as d'autres infos...

Discussions similaires

  1. SQL Server, mise en ligne de plusieur données avec délimiteur
    Par manhattan.project dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/06/2007, 18h52
  2. PB de Sort avec une TcxGrid de Devexpress
    Par Cazaux-Moutou-Philippe dans le forum Delphi
    Réponses: 3
    Dernier message: 31/05/2007, 02h22
  3. Réponses: 6
    Dernier message: 24/05/2007, 12h47
  4. [VBA-E] Tirage au sort avec probabilité
    Par clarisse dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/05/2006, 12h01
  5. [XSL] xsl:sort avec parametre et condition
    Par elraton dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/01/2005, 21h59

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