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 :

Supprimer un doublon par rapport à un critère


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut Supprimer un doublon par rapport à un critère
    Bonjour,

    J'ai un fichier du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0|1|champ01|champ02|champ03|champ04
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    0|2|champ09|champ10|champ11|champ12
    ERR|3|champ13|champ14|champ15|champ16
    0|3|champ17|champ18|champ19|champ20
    0|4|champ21|champ22|champ23|champ24
    J'aimerais supprimer les doublons avec le critère de dédoublonnage suivant :
    - Prendre les lignes dont les valeurs de la seconde colonne sont identiques.
    - Garder uniquement les lignes dont la première colonne commence par ERR et supprimer celles dont la colonne commence par 0. Ce qui nous donne dans le cas présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    0|2|champ09|champ10|champ11|champ12
    ERR|3|champ13|champ14|champ15|champ16
    0|4|champ21|champ22|champ23|champ24
    Donc, les lignes ci-dessous ont été supprimées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0|1|champ01|champ02|champ03|champ04
    0|2|champ09|champ10|champ11|champ12

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Si j'ai bien compris, ce dont je doute,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|2|champ09|champ10|champ11|champ12
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|4|champ21|champ22|champ23|champ24
    ont la même valeur dans la seconde colonne ?

    Le traitement serait plutôt :
    1. je garde toutes les lignes commençant par ERR que j'injecte dans monnouveaufichier
    2. je récupère les valeurs de la seconde colonne de monnouveaufichier
    3. S'il y a des lignes qui ne commencent par par ERR et qui n'ont pas une des valeurs de la 2e colonne des lignes commençant par ERR, alors je les ajoute au à la fin de monnouveaufichier
    4. Enfin je trie par ordre croissant en fonction de la 2e colonne.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut
    Les deux lignes ci-dessous n'ont pas la même valeur sur la seconde colonne. La première donne "2" et la seconde donne "4". Donc, vous doutez bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|2|champ09|champ10|champ11|champ12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|4|champ21|champ22|champ23|champ24
    Le traitement serait plutôt :

    1- Je garde toutes les lignes commençant par ERR que j'injecte dans monnouveaufichier
    2- Je récupère les valeurs de la seconde colonne de monnouveaufichier
    3- S'il y a des lignes qui ne commencent par par ERR et qui n'ont pas une des valeurs de la 2e colonne des lignes commençant par ERR, alors je les ajoute au à la fin de monnouveaufichier
    4- Enfin je trie par ordre croissant en fonction de la 2e colonne.

    C'est tout à fait ce que je cherche à faire. Bien reformulé

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

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

    Je garde toutes les lignes commençant par ERR
    si le résultat doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    0|2|champ09|champ10|champ11|champ12
    ERR|3|champ13|champ14|champ15|champ16
    0|4|champ21|champ22|champ23|champ24
    alors, c'est faux !
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut
    Oups je pense avoir compris d'où vient l'incompréhension. Je me suis mélangé les pinceaux sur la liste des lignes à supprimer. Je corrige donc mon besoin en découpant mon cas d'usage en plusieurs sous cas.

    Pour information, mon fichier a pour séparateur "|".

    Cas N°1:la valeur de la seconde colonne est identique pour les trois lignes (chiffre 1).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0|1|champ01|champ02|champ03|champ04
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    Les lignes commençant par ERR sont prioritaires, donc, je dois obtenir au final ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    Cas N°2:cette ligne est unique. Donc, elle reste dans le fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|2|champ09|champ10|champ11|champ12
    Cas N°3:La valeur de la seconde colonne est identique pour les deux lignes (chiffre 3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERR|3|champ13|champ14|champ15|champ16
    0|3|champ17|champ18|champ19|champ20
    . Les lignes commençant par ERR sont prioritaires, donc, je dois obtenir au final ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERR|3|champ13|champ14|champ15|champ16
    Cas N°4:identique au cas N°2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0|4|champ21|champ22|champ23|champ24
    Voici la liste des lignes à supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0|1|champ01|champ02|champ03|champ04
    0|3|champ17|champ18|champ19|champ20

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    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'|' '{
       c[$2]++
       l[++n]=$0
    }
    END{
       for(i=1;i<=n;i++){
          split(l[i],d,"|")
          if(c[d[2]]==1 || (c[d[2]]>1 && d[1]~"^ERR"))print l[i]
       }
    }' fichier
    ERR_X|1|champ05|champ06|champ07|champ08
    ERR_Y|1|champ05|champ06|champ07|champ08
    0|2|champ09|champ10|champ11|champ12
    ERR|3|champ13|champ14|champ15|champ16
    0|4|champ21|champ22|champ23|champ24
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/07/2014, 19h49
  2. Réponses: 1
    Dernier message: 13/03/2008, 12h13
  3. Recherche max par rapport à un critère
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2007, 07h56
  4. [SQL] Enlever les doublons par rapport a une colonne
    Par irenee dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/12/2005, 19h23
  5. Supprimer un fichier par rapport a une date
    Par NewB dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2003, 13h44

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