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 POSIX Discussion :

Trier le résultat de 2 commandes en enlevant les doublons (sans utilisation de fichier)


Sujet :

Shell et commandes POSIX

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Trier le résultat de 2 commandes en enlevant les doublons (sans utilisation de fichier)
    Bonjour,

    Je souhaiterai trier et enlever les lignes vides et doublons (entête) du résultat des commandes suivantes, sans utiliser de fichier :

    sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list

    Résultat:

    Id Name State
    ----------------------------------------------------
    3 lx27012 running
    4 lx27032 running
    5 lx27034 running
    6 lx27036 running
    7 lx27038 running
    8 lx27248 running

    Id Name State
    ----------------------------------------------------


    Résultat souhaité:

    Id Name State
    ----------------------------------------------------
    3 lx27012 running
    4 lx27032 running
    5 lx27034 running
    6 lx27036 running
    7 lx27038 running
    8 lx27248 running

    Je vous remercie d'avance pour votre aide.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 245
    Points : 13 464
    Points
    13 464
    Par défaut
    Bonjour

    Il n'y aura jamais de doublons si les lignes sont numérotées par un index auto-incrémenté comme ça semble être le cas.

    Sinon, on peut appliquer cette ligne (non testée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list | awk '{a[$0]++;} ((NF==0)||(a[$0]>1)){next;} 1'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 864
    Points : 6 572
    Points
    6 572
    Par défaut
    Tu dois d'abord grouper tes commandes, ensuite il suffit d'afficher sans condition les deux premières lignes, puis celles contenant un chiffre pour les autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | awk 'NR<3||/[0-9]/{print}'
    ou avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | sed '3,${/[0-9]/!d}'
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    @CosmoKnacki, attention tes regex /[0-9/ matchent si un chiffre est présent n'importe où sur la ligne, dans le nom de la machine par exemple

    @je2lo, l'exemple que tu donnes n'est peut-être pas bien choisi, par ailleurs tu serai bien inspiré d'utiliser les balises [CODE][/CODE], le premier caractère de chaque ligne étant en général un espace et non directement un chiffre

    l'output d'une seule commande ressemblerait plutôt à ça à priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Id Name              State
    --------------------------------------
      3 lx27012           running
      4 lx27032           running
      5 lx27034           running
      6 lx27036           running
      7 lx27038           running
      8 lx27248           running
    du coup j'y vais de ma proposition également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | awk '$1 ~ /[0-9]+/' | sort -un

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 864
    Points : 6 572
    Points
    6 572
    Par défaut
    @BufferBob: oui, c'est exact et volontaire, car à compter de la troisième ligne, les seules lignes contenant un chiffre (l'ID) sont celles qui nous intéressent. Le fait que /[0-9]/ cherche sur toute la ligne est sans importance, aucune autre ligne ne contient de chiffres (entêtes, lignes de tirets, ligne vide). Même si le nom de la machine contient un chiffre, de toute manière la correspondance aura lieu avant sur le premier chiffre de la ligne (le premier chiffre de l'ID).

    Par contre je ne savais pas qu'on pouvait rendre le print implicite en passant juste une condition (ça donne une nouvelle lumière sur le 1 que je voyais comme un raccourci du langage de derrière les fagots), du coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | awk '/[0-9]/||NR<3'
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 294
    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 294
    Points : 12 770
    Points
    12 770
    Par défaut
    Bonjour,
    Selon l'exemple donné, on peut simplifier en arrêtant d'afficher à la première ligne vide, ce qui donnerait:
    en sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | sed -n '/^$/q;p'
    ou en awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | awk '/^$/{X=1}1-X'
    Cordialement.

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 864
    Points : 6 572
    Points
    6 572
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Selon l'exemple donné, on peut simplifier en arrêtant d'afficher à la première ligne vide ...
    Certes, mais faire ça suppose qu'on sait à l'avance que la deuxième commande virsh ne renvoie aucun enregistrement. Dans cette hypothèse, inutile d'utiliser sed, awk ou quoi que ce soit d'autre quand il suffit d'enlever la deuxième commande.

    Une chose m'intrigue dans ta commande awk:/^$/{X=1}1-X.

    Je vois bien l'utilité de cette construction pour zapper toutes les lignes jusqu'à la fin dés lors qu'une ligne vide est rencontrée, mais dans ce cas, pourquoi ne pas écrire explicitement: /^$/{exit}1? La commande exit est-elle moins portable? Y a-t-il une raison particulière à utiliser une telle construction, ou peut être dans d'autres cas de figure?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 245
    Points : 13 464
    Points
    13 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list) | awk '/^$/{X=1}1-X'
    Je ne voudrais pas piquer le réplique de N_BaH mais pourquoi vous faites un sous-shell ?

    Ceci est tout aussi bien, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {sudo virsh -c qemu:///system list;sudo virsh -c lxc:/// list} | awk '/^$/{X=1}1-X'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 864
    Points : 6 572
    Points
    6 572
    Par défaut
    Chez moi ça ne fonctionne pas (Bash 4.3.11): La commande « {sudo » est introuvable.
    Et si je place un espace après l'accolade ouvrante, j'obtiens une invite comme si la commande n'était pas terminée. Il y a sûrement une autre syntaxe pour ne pas utiliser de "sous-shell" mais je ne la connais pas.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 864
    Points : 6 572
    Points
    6 572
    Par défaut
    Ah, j'ai trouvé, il faut juste terminer le bloc d'accolades par ;:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { sudo virsh -c qemu:///system list; sudo virsh -c lxc:/// list; } | awk '/[0-9]/||NR<3'
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 294
    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 294
    Points : 12 770
    Points
    12 770
    Par défaut
    Bon, ok, j'ai pas regardé le groupe de commande, je me suis juste basé sur l'exemple de sortie...

    Pour le sous-shell, je n' ai fait qu'un copier/coller sans regarder.

    Pour le exit dans le awk, j'y ai pensé après, il est vrai que j'ai eu un doute sur le fait que cela soit complètement portable selon la version de awk.

    Mais si ma solution awk (et sed) n'est pas bonne, la seule qui fait le boulot est celle de BufferBob

    En fait non, il perd l'entête par le trie (enfin, j'ai pas testé)
    Cordialement.

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    comment ça je perds la tête ??

    bon si y'a que ça, on considère l'input suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Id Name              State
    ----------------------------------------------------
      3 lx27012           running
      4 lx27032           running
      8 lx27248           running
     
     Id Name              State
    ----------------------------------------------------
      5 lx27034           running
      6 lx27036           running
      7 lx27038           running
    on applique un coup de wak :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { sudo cmd1; sudo cmd2; } | awk 'NR<3 {print; next} $1 ~ /^[0-9]/ {print | "sort -u"}'
    et l'output avec sa tête alouette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Id Name              State
    ----------------------------------------------------
      3 lx27012           running
      4 lx27032           running
      5 lx27034           running
      6 lx27036           running
      7 lx27038           running
      8 lx27248           running

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/09/2012, 08h24
  2. Comment trier un tableau pour enlever les doublons ?
    Par MuLog dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/03/2009, 20h54
  3. Réponses: 7
    Dernier message: 06/10/2008, 13h54
  4. trier et enlever les doublons en Shell
    Par sebcah dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 13/05/2008, 11h44
  5. Trier le résultat d'une commande dir?
    Par Johns dans le forum Langage
    Réponses: 6
    Dernier message: 13/03/2006, 17h24

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