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 de chaines de caractères


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut Tri de chaines de caractères
    Bonjour à tous,
    J'aimerai savoir s'il ya une commande en unix qui trai par ordre decroissant les chainbe de caractere en terme de taille de la chaine
    Par exemple j'ai :
    abc
    abcde
    abcdef
    et donc j'aimerai quil m'affiche
    abcdef
    abcde
    abc



    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 -r ?

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    sort -r ?
    Merci zipe31,
    pour sort -r : Inverser l'ordre de tri, afin que les lignes avec la plus grande valeur de cle apparaissent en premier.

    Mais je comprends pas là de quelle valeur on parle

    J'ai testé , mais ca na pas marché

  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
    Si on ne précise pas de clé (champ) alors c'est la ligne entière qui est prise en compte et donc celle ayant la plus grande valeur (en nombre de caractères) qui sera affichée en premier.

  5. #5
    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 étoile de mer Voir le message
    J'ai testé , mais ca na pas marché
    Pourtant :
    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
    $ echo -e "abcdef\nabcd\nabc\nabcdefg\nabcde"
    abcdef
    abcd
    abc
    abcdefg
    abcde
     
    $ echo -e "abcdef\nabcd\nabc\nabcdefg\nabcde" | sort
    abc
    abcd
    abcde
    abcdef
    abcdefg
     
    $ echo -e "abcdef\nabcd\nabc\nabcdefg\nabcde" | sort -r
    abcdefg
    abcdef
    abcde
    abcd
    abc
     
    $

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci beaucoup

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

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

    ça fonctionne parce que les chaînes sont elles-mêmes triées alphabétiquement,
    mais que se passe-t-il si les chaînes sont aléatoires ?

    soit la liste L :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    printf '%s\n' "${L[@]}"
    noffnyi
    susj
    pzdrjh
    ahf
    zmp
    mb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    printf '%s\n' "${array[@]}" | sort -r
    zmp
    susj
    pzdrjh
    noffnyi
    mb
    ahf


    il faut prendre en compte le nombre de caractères, et effectuer le tri dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in "${L[@]}"; do echo "${#i} $i"; done | sort -t' ' -rn -k1,1 | cut -d ' ' -f2
    noffnyi
    pzdrjh
    susj
    ahf
    zmp
    mb

  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 N_BaH Voir le message
    ça fonctionne parce que les chaînes sont elles-mêmes triées alphabétiquement,
    mais que se passe-t-il si les chaînes sont aléatoires ?
    Ben on applique ta méthode

    Sinon je n'ai fait que répondre à une demande sommaire, étayée d'un exemple tout aussi sommaire, et faute de mieux, j'ai répondu sommairement au mieux

  9. #9
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonsoir,

    Je reviens à ce souci là
    J'essaye là de taper la commande proposée par N_BaH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in "${L[@]}"; do echo "${#i} $i"; done | sort -t' ' -rn -k1,1 | cut -d ' ' -f2
    Mais il m'indique
    L: Undefined variable.
    Sinon, j'indique où le nom de fichier input?

    Merci

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

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

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    $ cat extrait_dico.txt 
    AA
    AALENIEN
    AALENIENNE
    AALENIENNES
    AALENIENS
    AAS
    ABACA
    ABACAS
    ABACOST
    ABACOSTS
    ABACULE
    ABACULES
    ABAISSA
    ABAISSABLE
    ABAISSABLES
    ABAISSAI
    ABAISSAIENT
    ABAISSAIS
    ABAISSAIT
    ABAISSAMES
    ABAISSANT
    ABAISSANTE
    ABAISSANTES
    ABAISSANTS
    ABAISSAS
    ABAISSASSE
    ABAISSASSENT
    ABAISSASSES
    ABAISSASSIEZ
    ABAISSASSIONS
    $ awk 'BEGIN{FS=""} {print NF,$0}' extrait_dico.txt |sort -rn |cut -d' ' -f2
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    ABAISSASSE
    ABAISSANTS
    ABAISSANTE
    ABAISSAMES
    ABAISSABLE
    AALENIENNE
    ABAISSANT
    ABAISSAIT
    ABAISSAIS
    AALENIENS
    ABAISSAS
    ABAISSAI
    ABACULES
    ABACOSTS
    AALENIEN
    ABAISSA
    ABACULE
    ABACOST
    ABACAS
    ABACA
    AAS
    AA

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    Citation Envoyé par étoile de mer
    'essaye là de taper la commande proposée par N_BaH
    Mais il m'indique
    L: Undefined variable.
    L est un tableau, que je n'ai pas explicitement déclaré.
    Sinon, j'indique où le nom de fichier input?
    Comment lire/parcourir un fichier

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Bonjour,
    Ici pour le coté simpliste, j'aurai une préférence pour perl:
    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
    30
    31
    $ perl -e 'print sort {length $b <=> length $a || $b cmp $a} <>' fichier
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    ABAISSASSE
    ABAISSANTS
    ABAISSANTE
    ABAISSAMES
    ABAISSABLE
    AALENIENNE
    ABAISSANT
    ABAISSAIT
    ABAISSAIS
    AALENIENS
    ABAISSAS
    ABAISSAI
    ABACULES
    ABACOSTS
    AALENIEN
    ABAISSA
    ABACULE
    ABACOST
    ABACAS
    ABACA
    AAS
    AA

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Et pour le côté "je fais tout en GNU awk sur une ligne" :
    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
    30
    31
    $ awk 'function f(a,b,c,d){return(d==b?a<c:d-b)}{l[$0]=length}END{PROCINFO["sorted_in"]="f";for(s in l)print s}' dico.txt
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    ABAISSASSE
    ABAISSANTS
    ABAISSANTE
    ABAISSAMES
    ABAISSABLE
    AALENIENNE
    ABAISSANT
    ABAISSAIT
    ABAISSAIS
    AALENIENS
    ABAISSAS
    ABAISSAI
    ABACULES
    ABACOSTS
    AALENIEN
    ABAISSA
    ABACULE
    ABACOST
    ABACAS
    ABACA
    AAS
    AA

  14. #14
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci beaucoup les gars
    Ca marche sur tous les cotés

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    2 autres versions basées sur un algo différent:
    Avec gawk:
    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
    30
    31
    $ gawk '{a[$0]=sprintf("%70s",$0)}END{PROCINFO["sorted_in"]="@val_str_desc"; for(i in a) print i}' fichier
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    ABAISSASSE
    ABAISSANTS
    ABAISSANTE
    ABAISSAMES
    ABAISSABLE
    AALENIENNE
    ABAISSANT
    ABAISSAIT
    ABAISSAIS
    AALENIENS
    ABAISSAS
    ABAISSAI
    ABACULES
    ABACOSTS
    AALENIEN
    ABAISSA
    ABACULE
    ABACOST
    ABACAS
    ABACA
    AAS
    AA
    Et sur le même principe, avec printf et sort:
    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
    30
    31
    $ printf "%s\n" $(printf "%70s\n" $(<fichier) | sort -nr)
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    ABAISSASSE
    ABAISSANTS
    ABAISSANTE
    ABAISSAMES
    ABAISSABLE
    AALENIENNE
    ABAISSANT
    ABAISSAIT
    ABAISSAIS
    AALENIENS
    ABAISSAS
    ABAISSAI
    ABACULES
    ABACOSTS
    AALENIEN
    ABAISSA
    ABACULE
    ABACOST
    ABACAS
    ABACA
    AAS
    AA

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 300
    Par défaut
    Ne manquerait-il pas un gros bout sur la deuxième?

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Comme quoi ?

  18. #18
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et sur le même principe, avec printf et sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf "%s\n" $(printf "%70s\n" $(<fichier) | sort -nr)
    ABAISSASSIONS
    ...
    AA
    Très judicieux, mais il faut préciser la locale pour être sûr que le tri se fasse dans l'ordre attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s\n" $(printf "%70s\n" $(<fichier) | LC_ALL=C sort -nr)

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Je suis d'accord, mais dans ce cas spécifique à la langue car si on a des caractères accentués (UTF-8), le printf et le tri ne fonctionne pas correctement avec la locale C.
    D'ailleurs, dans le concept, sur un tri numérique, j'aurais pensé qu'il ne tienne pas compte du charmap puisque numérique donc dans mon esprit c'était une comparaison binaire...
    Exemple en "C" j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ABAISSASSIONS
    ABAîSSAIENT
    ABAISSASSIEZ
    ABAISSASSENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    En "fr_FR.UTF-8" j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSENT
    ABAîSSAIENT
    ABAISSASSES
    ABAISSANTES
    ABAISSAIENT
    ABAISSABLES
    AALENIENNES
    En interne, c'est "C" qui a raison, mais humainement c'est fr_FR.UTF-8.
    EDIT: Contrairement à awk, le printf de base ne tient pas compte du charmap dans le calcul de précision (ma chaine perd 1 caractère par caractère accentué)
    On peut fixé le problème en utilisant le printf de awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s\n" $(awk '{printf("%70s\n",$0)}' fichier | sort -nr)
    Mais dans ce cas, autant utiliser les versions gawk proposées sauf peut-être pour ceux qui utilisent un awk autre que gawk...

  20. #20
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    en fr_FR.UTF-8, l'ordre n'est pas bon du tout:
    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
    30
    31
    printf "%s\n" $(printf "%70s\n" $(<fichier) | LC_ALL=C.UTF-8 sort -nr)
    ABAISSASSIONS
    ABAISSASSIEZ
    ABAISSASSES
    ABAISSASSENT
    ABAISSASSE
    ABAISSAS
    ABAISSANTS
    ABAISSANTES
    ABAISSANTE
    ABAISSANT
    ABAISSAMES
    ABAISSAIT
    ABAISSAIS
    ABAISSAIENT
    ABAISSAI
    ABAISSABLES
    ABAISSABLE
    ABAISSA
    ABACULES
    ABACULE
    ABACOSTS
    ABACOST
    ABACAS
    ABACA
    AAS
    AALENIENS
    AALENIENNES
    AALENIENNE
    AALENIEN
    AA
    Quelle version de sort utilises-tu ? sur quel OS ?

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

Discussions similaires

  1. Programme de tri de chaine de caractères
    Par vetchang dans le forum Langage
    Réponses: 1
    Dernier message: 27/05/2008, 18h26
  2. Tri de chaine de caractère avec fgets
    Par clampin dans le forum Débuter
    Réponses: 4
    Dernier message: 16/05/2008, 23h42
  3. Comparaisons et tri des chaines de caractère.
    Par liliemmy dans le forum SQL
    Réponses: 2
    Dernier message: 01/04/2008, 18h52
  4. code de filtre et tri des chaines de caractères
    Par fatenatwork dans le forum Collection et Stream
    Réponses: 18
    Dernier message: 12/03/2008, 17h31
  5. Réponses: 17
    Dernier message: 16/12/2005, 10h45

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