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 et sur les chaînes de caractères


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 13
    Points : 14
    Points
    14
    Par défaut Sort et sur les chaînes de caractères
    Bonjour;

    Actuellement étudiant en licence d'informatique, je bloque sur un exercice de tp Système avec la commande sort.

    Pour résumer j'ai un fichier liste.txt avec des noms d'étudiants et leur numéro qui prend la forme suivante:
    "EMMANUEL-EMILE CYRIL linf151"

    Je dois trier dans un fichier temp les étudiants en fonction de leur numéro affiché sur la troisième colonne.
    Il propose pour cela un algorithme qui consiste à trier dans un premier temps les étudiants avec un chiffre, puis en suite ceux avec deux, ect...

    Pour récupérer la liste des étudiants avec un chiffre, je fais la commande grep 'linf[0-9]$' liste.txt , avec deux grep 'linf[0-9][0-9]$' liste.txt, etc...

    J'ai donc voulu créer un filtre en redirigeant la sortie standard de la commande grep sur l'entrée de la commande sort mais impossible de trier les étudiants par rapport au nombre de la troisième colonne. Après avoir regardé le man sort, j'ai testé cela grep 'linf[0-9]$' liste.txt | sort -n -k 3 > temp ou encore sort -k 3n,3n. J'ai l'impression que sort avec l'option du trie numérique transforme les lettres de la troisième colonne en chiffre. Auriez vous donc une solution sachant qu'il faut utiliser sort s'il vous plaît ? J'ai vu sur internet qu'il était possible de trier par rapport aux caractères d'une colonne et non par rapport à la colonne entière mais je n'ai pas réussi en suivant les exemples du net.

    Deuxième question qui me pose problème, il est indiqué dans le cours que les chaînes délimitées par ' ' annulent les significations des métacaractères sauf que pourtant la commande grep 'linf[0-9]$' fonctionne alors que les listes placées entre [ ] sont désignés comme des métacaractères du shell. Donc si vous pouviez s'il vous plaît m'éclaircir par rapport aux chaînes délimitées par des ' ' et par des " ".

    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo 'abc12
    abc6
    abc5' | sort -k1.4,1.6n
    abc5
    abc6
    abc12
    grep est ici tout à fait superflu.

    2. entre ' ou entre", les caractères spéciaux du shell perdent leur caractère spécial.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo *
    fic1 fic2 ...
    $ echo '*'
    *
    les crochets font aussi partie des regex (cf. man 7 regex), et donc, si leur caractère spécial est inhibé, elle sont une partie d'une regex.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Citation Envoyé par Menudelux Voir le message
    J'ai vu sur internet qu'il était possible de trier par rapport aux caractères d'une colonne et non par rapport à la colonne entière mais je n'ai pas réussi en suivant les exemples du net.
    Si tu relis attentivement le man de sort, tu verras en effet qu'on peut trier sur une colonne et plus précisément sur les caractères d'une colonne.


    Citation Envoyé par Menudelux Voir le message
    Deuxième question qui me pose problème, il est indiqué dans le cours que les chaînes délimitées par ' ' annulent les significations des métacaractères sauf que pourtant la commande grep 'linf[0-9]$' fonctionne alors que les listes placées entre [ ] sont désignés comme des métacaractères du shell. Donc si vous pouviez s'il vous plaît m'éclaircir par rapport aux chaînes délimitées par des ' ' et par des " ".

    Merci d'avance.
    Les ' ', " " et \ désactivent en effet les caractères spéciaux pour le shell. C'est à dire que le shell ne va pas les interpréter avant que la commande soit exécutée.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ls -l
    total 4
    -rw-rw-r-- 1 Postmortem Postmortem 6 oct.   4 15:20 fic.txt
    -rw-rw-r-- 1 Postmortem Postmortem 0 oct.   4 15:19 toto1
    $ grep toto[0-9] fic.txt
    $ grep 'toto[0-9]' fic.txt
    toto2
    $
    Le premier grep ne sort rien car il y a un fichier toto1 dans le répertoire ; le shell remplace toto[0-9] par toto1 et c'est donc un grep de toto1 dans fic.txt qui est fait.
    Il faut donc faire attention aux caractères spéciaux du shell et ensuite, faire attention aux caractères spéciaux pour la commande.

    Pour désactiver l'interprétation d'un caractère spécial dans une expression régulière, il faut mettre \ devant.

    Edit : ah, je fusse grillé !

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Est ce que ceci vous aide ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat test.txt 
    nom1 prenom1 15632
    nom2 prenom2 12580
    nom3 prenom3 97453
    nom4 prenom4 04598
    nom5 prenom5 75219
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat test.txt | awk -F " " {' print $3,$2,$1 '} | sort
    04598 prenom4 nom4
    12580 prenom2 nom2
    15632 prenom1 nom1
    75219 prenom5 nom5
    97453 prenom3 nom3
    Avec cette commande vous avez trié selon les numéros de la troisième colonne.


    Maintenant, si on souhaites trier par nombre de chiffres il faut ajouter un flag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat test.txt 
    nom1 prenom1 1632
    nom2 prenom2 1258098987254
    nom3 prenom3 93
    nom4 prenom4 04598
    nom5 prenom5 752195
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat test.txt | awk -F " " {' print $3,$2,$1 '} | sort -g
    93 prenom3 nom3
    1632 prenom1 nom1
    04598 prenom4 nom4
    752195 prenom5 nom5
    1258098987254 prenom2 nom2

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Est ce que ceci vous aide ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat test.txt 
    nom1 prenom1 15632
    [...]
    est-ce que ça correspond au problème exposé :
    j'ai un fichier liste.txt avec des noms d'étudiants et leur numéro qui prend la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EMMANUEL-EMILE CYRIL linf151
    [...]trier [...] les étudiants en fonction de leur numéro affiché sur la troisième colonne.
    le problème original énonce que le troisième champ ne contient pas que des chiffres !

    je passe sur l'UUOC, déjà sanctionné dans ton autre message.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Modérateur juge, singlant, froid, expéditif et surtout non constructif.
    Je quitte ce poste.
    Desolé pour l’auteur qui trouvera sûrement une très bonne solution avec les élites actuels.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par integration-it Voir le message
    Modérateur juge, singlant, froid, expéditif et surtout non constructif.
    Je quitte ce poste.
    Desolé pour l’auteur qui trouvera sûrement une très bonne solution avec les élites actuels.
    Ta participation est la bienvenue, et je peux comprendre que la réponse ne soit pas agréable.

    Mais l'expression "non constructif" est fausse. Elle traduit ton dépit.

    • cat ne sert à rien.
    • sort sait trier selon des colonnes sans utiliser awk.
    • Le problème initial n'est pas celui que tu résous.
    • La réponse "efficace" a déjà été donnée.


    Tu voulais enseigner et tu as appris.
    J'espère que tu continueras à participer et progresser en même temps que nous.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2016, 09h58
  2. [Encodage] Fonctions sur les chaînes de caractères multi-octets
    Par Rémy DEV dans le forum Langage
    Réponses: 0
    Dernier message: 25/07/2012, 10h33
  3. Exercice sur les chaînes de caractères
    Par L'aigle de Carthage dans le forum Pascal
    Réponses: 6
    Dernier message: 31/10/2008, 20h48
  4. Besoin d'exercices sur les chaînes de caractères
    Par Elammath dans le forum Général Python
    Réponses: 7
    Dernier message: 30/06/2008, 13h09
  5. [requète] travail sur les chaînes de caractères
    Par just xav dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/07/2007, 14h08

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