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 :

Grep Uniq sur colonne dans un fichier CSV en KSH


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Système Linux

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 25
    Points
    25
    Par défaut Grep Uniq sur colonne dans un fichier CSV en KSH
    Bonjour à tous,

    Voici un problème en programmation Shell (KSH) auquel je suis exposé et dont j'aimerai bien trouver une solution.

    A partir d'un fichier CSV contenant une 20aine de champs, je dois extraire les lignes dont le champ contenant l'e-mail ne doit pas être dupliqué dans les autres lignes (donc unique). Le problème majeur est que le fichier CSV contient des milliers de lignes (~ 300.000) et qu'un algorithme avec des boucles (WHILE, FOR ou UNTIL) ne serait pas les bienvenus vu le temps de traitement que cela prendrait. Par contre j'ai à ma disposition AWK et/ou SED.

    Exemple de fichier en entrée :

    1,u,toto@mail.com
    2,v,titi@mail.com
    3,w,tutu@mail.com
    4,x,tata@mail.com
    5,y,titi@mail.com

    Doit devenir en fichier de sortie :

    1,u,toto@mail.com
    3,w,tutu@mail.com
    4,x,tata@mail.com

    Merci d'avance pour votre aide !

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Bonjour,

    Pourquoi as-tu supprime titi@mail.com ?

    As-tu regarde sort -u ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Système Linux

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Pourquoi as-tu supprime titi@mail.com ?
    ...

    Parce que c'est un mail en doublon que je désire éliminer du fichier initial !

  4. #4
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    La commande pour résoudre ton problème est sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -u -t ',' -k 3,3 fichier_entree > fichier_sortie
    Si le champ mail est le dixième, l'option -k devient: -k 10,10.
    Un problème bien posé est déjà résolu (H. Bergson).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Système Linux

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Merci, c'est intéressant mais malheureusement cette commande ne renvoie pas le bon résultat, la deuxième ligne est en trop :

    4,x,tata@mail.com
    2,v,titi@mail.com
    1,u,toto@mail.com
    3,w,tutu@mail.com

    Il faut carrément supprimer toutes les lignes contenant titi@mail.com !

  6. #6
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Ah! Tu ne veux pas supprimer les doublons mais complètement supprimer les lignes dont les mails apparaissent plusieurs fois! C'est nettement plus compliqué. Il va falloir le faire en deux passes: la première pour détecter quelles sont les lignes en double et la seconde passe pour supprimer ces lignes. Je regarde dans la soirée...
    Un problème bien posé est déjà résolu (H. Bergson).

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Système Linux

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Perso, voici ce que j'ai fait en attendant un code plus optimisé.

    # on met dans un fichier les emails en doublon
    cat fichier_input | cut -d ',' -f3 | sort | uniq -d > duplicate_emails
    while read email
    do
    # on supprime les emails en doublon un par un
    cat fichier_input | sed -e "/$email/d" > fichier_temp
    cp fichier_temp fichier_input
    done < duplicate_emails

    C'est pas très propre et le traitement est long mais bon... ça marche !

  8. #8
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bon, finalement j'utilise une méthode un peu différente:

    1. Je trie d'abord le fichier en fonction des adresses email (donc les lignes avec les mêmes adresses apparaissent successivement).
    2. Je n'imprime la ligne précédente que si son mail est différent de la ligne courante.

    Résultat:
    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
    sort -t ',' -k 3,3 fichier.init > fichier.tmp
    awk -F ',' '
    {
      if ($3 != prevMail)
      {
        if (prevPrint == 1)
        {
          print prevLine
        }
        prevLine = $0
        prevMail = $3
        prevPrint = 1
      }
      else { prevPrint = 0 }
    }
    END {if (prevPrint == 1) { print $0 }}' fichier.tmp > fichier.final
    Il faudra bien tester le code avant de le passer en production!
    Un problème bien posé est déjà résolu (H. Bergson).

Discussions similaires

  1. Ajout d'une colonne dans un fichier csv
    Par sorilazer dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 12/11/2012, 18h08
  2. Sélection de colonnes dans un fichier csv
    Par MottetCCSF dans le forum Langage
    Réponses: 1
    Dernier message: 20/12/2007, 15h42
  3. Réponses: 4
    Dernier message: 13/12/2006, 17h10
  4. [débutant] nombre de colonne dan sun fichier csv
    Par mandagor dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2005, 15h42

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