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 :

Comment traiter les ruptures premières ou les ruptures dernières d'un fichier ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut Comment traiter les ruptures premières ou les ruptures dernières d'un fichier ?
    Bonjour,

    je n'arrive pas à conclure un traitement sur un fichier csv volumineux.
    Pour simplifier, ce fichier se compose ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    date_aaaammjj_01; clé_01;etc_01;...;...;...;
    date_aaaammjj_02; clé_01;etc_02;...;...;...;
    date_aaaammjj_03; clé_01;etc_03;...;...;...;
    date_aaaammjj_04; clé_01;etc_04;...;...;...;
    date_aaaammjj_05; clé_01;etc_05;...;...;...;
    Et cela avec de nombreuses autres clés.

    Le fichier est trié sur :
    -1- la clé (seconde colonne)
    -2- la date première colonne)

    La question est simple :
    1/ Comment ne traiter (par exemple Lister) que la première ligne de chaque clé ?
    et son alternative
    2/ Comment ne traiter (par exemple Lister) que la dernière ligne de chaque clé ?

    Bonne année 2023 à tous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    2 0 2 3 
    --------   =   17**2
    2+0+2+3

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

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

    1/ sort -u ....,
    2/ tac | sort -u....
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

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

    Je suis sûr que tu as déjà vu la technique ici, avec awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -F';' '!vu[$2]++' fichier.csv
    date_aaaammjj_01; clé_01;etc_01;...;...;...;

  4. #4
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    Bonjour,

    J'ai du mal à déchiffrer ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk -F';' '!vu[$2]++' fichier.csv
    -F';' : signale que le séparateur de champs du fichier csv est le point-virgule.
    ! : représente (il me semble) un NOT.
    $2 : représente (il me semble) la colonne où se trouvent les clés, c.à.d. la seconde colonne du fichier csv.

    vu : je ne sais pas ; un vecteur ?
    ++ : je ne sais pas ; une incrémentation ?

    Je suis dans le brouillard ; d'où deux autres questions :

    Q1/ Où trouver une bonne doc à lire sur awk de préférence en français ?

    Q2/ Peut-on faire sans awk ? (N_BaH propose la commande unique, mais les lignes sont différentes !)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    "vu" est un tableau associatif (c'est à dire un tableau qui a des indices texte au lieu d'indices nombre).
    !vu[$2] signifie donc, littéralement, "tant qu'on l'a pas vu, on l'affiche". Et l'incrémentation change la valeur pour la clé. Donc elle n'est plus zéro, donc on l'a déjà vu. On n'affichera plus une ligne avec cette clé.


    R1 : "gawk manual" est pas mal.

    R2 : Si tu tries selon un champ avec sort, l'élément unique qu'il garde est le premier. N'est-ce pas ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    c'est ça.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    R1 : "gawk manual" est pas mal.
    Cest pour avoir :
    Un lien ? un pdf ? un livre ?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293

  9. #9
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    Merci pour le lien.

    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk -F';' '!vu[$3]++' fichier.csv
    fonctionne bien !

    Ce n'est pas le cas du
    En fait, j'ai trop simplifié la description de mon fichier csv :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    champ1 date aaaammjj sur 8 car.
    champ2 "ce que représente la clé de longueur variable (mais la même longueur pour une même clé).
    champ3 Clé sur 12 car.
    Autres champs suivant de longueur variable.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    le sort -u seul ne fonctionnera pas; il faut indiquer le séparateur de champs et le(s) champ(s) qui ser(ven)t pour le tri !
    et puis « ça marche pas » , c'est un état de faits, ça ne dit rien de ce qu'il se passe ou pas.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    peut-être faut-il inverser les champs : champ2 et champ3 (par un awk je pense ? commande à définir)
    puis appliquer un sort avec ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t";" -k2,2 -k1,1nr fichier.csv > ftmp1.csv
    puis appliquer la commande uniq avec l'option -s pour sauter les 8 caractères du champ1 qui est une date de la forme aaaammjj,
    avec ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uniq -s 8 ftmp1.csv > ftmp2.csv
    Qu'en dites vous ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    peut-être faut-il inverser les champs
    pourquoi ?

    il faudrait un exemple plus représentatif de ton fichier de départ, le résultat que tu veux, et ce que tu obtiens avec la commande que tu nous montreras aussi.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Au vu du résultat des awk et des exemples, avec sort ça donne:
    Pour le Deuxiéme champs:
    Pour le troisième:
    Après, comme le dit N_BaH, il nous manque de vrais exemples

  14. #14
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    Je vais prendre un temps pour trouver une solution avec sort et uniq.

    Si je trouve, je transmettrai le code trouvé.

    Si je ne trouve pas, je donnerai un exemple plus significatif et réel.

  15. #15
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    Voici un résumé de ce post.

    Soit un fichier csv de format ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dte_8c.1;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_01;...;...;
    dte_8c.2;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_02;...;...;
    dte_8c.3;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_03;...;...;
    dte_8c.4;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_04;...;...;
    dte_8c.5;désignation_clé_02_de_longueur_variable;clé_12car.02xxxxxxxxxx;etc_05;...;...;
    dte_8c.6;désignation_clé_03_de_longueur_variable;clé_12car.03yyyyy;etc_06;...;...;
    dte_8c.7;désignation_clé_03_de_longueur_variable;clé_12car.03yyyyy;etc_07;...;...;
    Le champ n°1 représente des dates au format aaaammjj sur 8 caractères.
    Le champ n°2 représente la description de la clé de longueur variable.
    Le champ n°3 représente la clé sur 12 caractères.
    puis vient ensuite un certain nombre de champs . . .

    1/ Comment ne traiter (par exemple Lister) que la ligne la plus récente de chaque clé ?

    En utilisant les commandes sort et uniq en tapant ce
    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
    # 6/ Changer l'ordre des champs en permutant le champ n°2 et le champ n°3 ...
    #    ... pour mettre la clé de longueur fixe avant sa désignation qui est de longueur variable
    #
    awk '{print $1 ";" $3 ";" $2 ";" $4 ";" $5 ";" $6 ";" $7 ";" $8 ";" $9}' FS=";" ftmp5.csv > ftmp6.csv
    
    #
    # 7/ Tri : 1/ col n°2 : Code_isin croissant
    #          2/ col n°1 : Date      décroissante
    #
    sort -t\; -k2,2 -k1,1nr ftmp6.csv > ftmp7.csv
    
    #
    # 8/ Traitement en rupture première sur la clé : ...
    #    ... en listant les lignes en rupture première par exemple
    #
    uniq -s 9 -w 12 ftmp7.csv > ftmp8.csv
    En n'utilisant que la commande awk en tapant ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #
    # 6/ Tri : 1/ col n°3 : Code_isin croissant
    #          2/ col n°1 : Date      décroissante
    #
    sort -t";" -k3,3 -k1,1nr ftmp5.csv > ftmp6.csv
     
    # 7/ Traitement en rupture première sur la clé : ...
    #    ... en listant les lignes en rupture première par exemple
    #
    awk -F';' '!vu[$3]++' ftmp6.csv
    that's all folks

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat /tmp/ruptures.csv
    dte_8c.1;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_01;...;...;
    dte_8c.2;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_02;...;...;
    dte_8c.3;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_03;...;...;
    dte_8c.4;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_04;...;...;
    dte_8c.5;désignation_clé_02_de_longueur_variable;clé_12car.02xxxxxxxxxx;etc_05;...;...;
    dte_8c.6;désignation_clé_03_de_longueur_variable;clé_12car.03yyyyy;etc_06;...;...;
    dte_8c.7;désignation_clé_03_de_longueur_variable;clé_12car.03yyyyy;etc_07;...;...;
    la clé est le troisième champ. c'est tout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sort -t ';' -k3,3 -u /tmp/ruptures.csv
    dte_8c.1;désignation_clé_01_de_longueur_variable;clé_12car.01;etc_01;...;...;
    dte_8c.5;désignation_clé_02_de_longueur_variable;clé_12car.02xxxxxxxxxx;etc_05;...;...;
    dte_8c.6;désignation_clé_03_de_longueur_variable;clé_12car.03yyyyy;etc_06;...;...;
    qu'est-ce qui ne te convient pas ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par N_BaH Voir le message
    qu'est-ce qui ne te convient pas ?
    c'est surtout que son exemple est bien tronqué Si j'ai bien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    20230105;xxxx;voiture;data1
    20230120;xxxx;voiture;data2
    20230112;xxxx;voiture;data3
    20230105;xxxx;velo,data4
    20230120;xxxx;velo;data5
    20230112;xxxx;velo;data6
    20230125;xxxx;pied;data7
    20230116;xxxx;pied;data8
    20230107;xxxx;pied;data9
    lister que la première ligne ( la plus récente - colonne 1) pour chaque clé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    20230105;xxxx;velo;data4
    20230105;xxxx;voiture;data1
    20230107;xxxx;pied;data9
    et pouvoir aussi lister que la dernière ligne ( la plus ancienne - colonne 1) pour chaque clé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    20230120;xxxx;voiture;data2
    20230120;xxxx;velo;data5
    20230125;xxxx;pied;data7

  18. #18
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    @N_BaH

    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t ';' -k3,3 -u /tmp/ruptures.csv
    fonctionne effectivement bien !

    J'ai appris qqchose; merci.

    Le -u (uniq) s'applique à la clé du sort, mais pas à toute la ligne.
    D'où l'importance de bien mettre le deuxième "3" dans ; -k3,3

    C'est ça ?

    Si c'est bien ça, les options -s et -w de la commande uniq ne doivent pas servir très souvent.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Citation Envoyé par papajoker Voir le message
    et pouvoir aussi lister que la dernière ligne ( la plus ancienne - colonne 1) pour chaque clé :
    Oui, on n'a pas traité le cas. Mais on peut facilement retourner le fichier avec la commande tac (inverse de cat). Et si la solution awk est retenue (sans tac), chaque nouvelle entrée chasse l'autre dans le tableau associatif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -F';' '{vu[$2]=$0;} END{for (i in vu) print vu[i]}' fichier.csv 
    date_aaaammjj_05; clé_01;etc_05;...;...;...;

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    j'ai montré l'emploi de tac dans mon premier message.

    et toc!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Comment traiter les espaces dans le nom du fichier
    Par maban dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/08/2007, 20h25
  2. [GD] Comment traiter les yeux rouges ?
    Par Roromix dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 04/06/2007, 12h38
  3. Comment traiter les GError **error ?
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 02/04/2007, 09h30
  4. [VB.NET] Page Edition, comment traiter les <br?
    Par zigoto dans le forum ASP.NET
    Réponses: 12
    Dernier message: 08/02/2005, 17h05

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