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 :

Sélection multiligne en Shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut Sélection multiligne en Shell
    Bonjour,
    À partir d'un fichier .csv trié sur un des champs du fichier (par exemple "champ_1"), comment par une commande ou un script Shell, obtenir en sortie, le même fichier contenant uniquement les lignes où "champ-1" n'est pas unique ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    01;a;b;c
    02;1;2;3
    02;A;B;C
    04;m;n;o
    07;l;i;a
    07;L;I;A
    07;L;i;a
    09;e;;n;d
    produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    02;1;2;3
    02;A;B;C
    07;l;i;a
    07;L;I;A
    07;L;i;a

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ join -t';' -j1 <(cut -d ';' -f1 entree.txt | uniq -d) <(sort -t ';' -k1,1 entree.txt)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ join -t';' -j1 -o 2.1 2.2 2.3 2.4 <(uniq -d -w2 entree.txt) <(sort -t ';' -k1,1 entree.txt)

  3. #3
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Merci N_BaH
    Je testerai demain matin.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    N'aurais-tu pas déjà posé la question ?

    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
    $ awk -F';' -vc=1 '(tab[$c]!=""){if (p[$c]==0) {print tab[$c];p[$c]=1;}; print;next;} {tab[$c]=$0;}' fichier.txt 
    02;1;2;3
    02;A;B;C
    07;l;i;a
    07;L;I;A
    07;L;i;a
    $ awk -F';' -vc=2 '(tab[$c]!=""){if (p[$c]==0) {print tab[$c];p[$c]=1;}; print;next;} {tab[$c]=$0;}' fichier.txt 
    07;L;I;A
    07;L;i;a
    $ awk -F';' -vc=3 '(tab[$c]!=""){if (p[$c]==0) {print tab[$c];p[$c]=1;}; print;next;} {tab[$c]=$0;}' fichier.txt 
    07;l;i;a
    07;L;i;a
    $ awk -F';' -vc=4 '(tab[$c]!=""){if (p[$c]==0) {print tab[$c];p[$c]=1;}; print;next;} {tab[$c]=$0;}' fichier.txt 
    07;l;i;a
    07;L;i;a

  5. #5
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    À Flodelarab : je ne crois pas. (ou je ne m'en souviens plus)

    Le premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ join -t';' -j1 <(cut -d ';' -f1 entree.txt | uniq -d) <(sort -t ';' -k1,1 entree.txt)
    marche avec l'exemple proposé, mais ne marche pas sur mes fichiers en réel; j'ai dû faire une erreur; je vais chercher.

    J'aurais quatre autres questions :

    Q1/ Si je voulais mettre le résultat du "join" (première commande) dans un fichier, je ferais comment ?

    Q2/ Décomposer la première commande "join" avec des fichiers intermédiaires temporaires en l'écrivant sur trois lignes; ça donnerait quoi ?

    Q3/ Pourrait_on s'en sortir avec la commande "sed" ?
    Je demande ça car j''ai vu que "sed" possède deux buffers (1. active_pattern_ space et 2.auxiliary_hold_ space)
    D’où une la dernière question plus générale :

    Q4/ La commande "sed" peut-elle gérer les ruptures premières ou dernières sur un champ ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    1/ tu rediriges la sortie standard de la commande vers un fichier.
    2/ je ne fais pas ça. Quel gain espères-tu ?
    3,4/ quand on travaille sur des colonnes/champs (typiquement des .csv) awk est beaucoup mieux adapté.

  7. #7
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Réponse
    1/ tu rediriges sortie standard de la commande vers un fichier.
    Comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -t';' -j1 <(cut -d ';' -f1 entree.txt | uniq -d) <(sort -t ';' -k1,1 entree.txt) > fichier_reception_resultat_commande.csv

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    c'est ça.

  9. #9
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Eh bien le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -t';' -j1 <(cut -d ';' -f1 entree.txt | uniq -d) <(sort -t ';' -k1,1 entree.txt) > fichier_reception_resultat_commande.csv
    ne marche pas;

    Le fichier "fichier_reception_resultat_commande.csv" est vide à tord !

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Pour que la methode de N_BaH fonctionne, il faut que ton fichier soit trié, sinon le uniq -d ne fera pas son boulot.

    Une version en awk (il y a bien 2 fois le fichier entree.txt) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'FNR == NR {a[$1]++;next}a[$1]>1' entree.txt entree.txt
    que l'on peut rediriger dans un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'FNR == NR {a[$1]++;next}a[$1]>1' entree.txt entree.txt >sortie.txt

  11. #11
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Merci disedorgue, je vais étudier cette commande "awk" avec attention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'FNR == NR {a[$1]++;next}a[$1]>1' entree.txt entree.txt >sortie.txt
    En attendant, j'ai obtenu ce que je voulais avec ces commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sort -t ';' -k1,1 fcumulunion.csv        > ftmp1.csv
     
    cut -d ';' -f1 ftmp1.csv | uniq -d       > ftmp2.csv
     
    join -t';' -j1  ftmp2.csv  ftmp1.csv     > fresult.csv
     
     
    cat fresult_titre.csv fresult.csv > fresult_edition.csv
    C'est plus long certes, mais les fichiers temporaires me permettent de mieux voir ce qui se passe et aussi débugger plus facilement.
    je fais ensuite la commande "pr" pour éditer le fichier "fresult_edition.csv"

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 17/10/2017, 14h44
  2. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  3. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  4. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

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