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 :

Recherche dans un fichier et récursivité


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut Recherche dans un fichier et récursivité
    Bonjour,

    J'ai un fichier csv en entrée qui se présente comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col1;col2
    CC;ZZ
    ZZ;BB
    BB;SS
    EE;QQ
    GG;WW
    WW;ZZ
    Je souhaite avoir en sortie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1;col2
    CC;SS
    EE;QQ
    GG;ZZ
    Je m'explique pour le premier résultat attendu. Les autres suivent le même raisonnement :
    - je lis la première ligne et je note la valeur de la col1, ici CC
    - toujours sur cette ligne, je prends le contenu de col2, ici ZZ
    - je recherche la chaîne ZZ dans la suite du fichier et sur la première colonne
    - je la trouve, le prends la valeur de la col2, ici BB
    - je recherche la chaîne BB dans la suite du fichier et sur la première colonne
    - je la trouve, le prends la valeur de la col2, ici SS
    - je recherche la chaîne SS dans la suite du fichier et sur la première colonne
    - je ne la trouve pas, j'affiche la valeur de col1 lue au tout début et la valeur de col2 de la dernière trouvaille, ici CC;SS

    J'ai déjà posé cette question sur le forum SQL et j'ai eu une réponse mais comme j'ai aussi la possibilité d'utiliser le shell, je fais appel à votre expertise en shell/Awk/Sed.

    Merci pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    perso je créerai une liste indexée de type colone1 => colone2 en lisant ligne par ligne le fichier.

    Il faudrait créer une fonction récursive qui recherche la valeur dans la liste.

    si dans la fonction, on trouve une clé on relance la fonction avec la valeur sinon on affiche la valeur.

  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

    L'exemple que tu as cité est-il faux ? Voilà ce que je trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -F';' '(NR==1){next;} {s[$1]=$2;p[$2]=1;} END{OFS=FS;for (i in s) if (p[i]!=1) {c=i;while (s[c]!="") c=s[c];print i,c} }' fichier.txt
    CC;SS
    EE;QQ
    GG;SS
    • On voit que la différence est dans le traitement de GG. Une fois que GG renvoie vers ZZ, faut-il se souvenir que ZZ renvoie vers BB ? Ou non ?
    • Ce code au déboté n'a pas de protection contre les références circulaires.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 670
    Par défaut
    il me semble vous avoir déjà vu plus dur avec des personnes qui posent des questions qui attendent qu'on fasse le boulot sans un début de solution.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    moi, j'ai l'impression que ça lecture est linéaire d'après l'exemple qu'il donne.

    En gros, la valeur de la col2 doit-être la valeur de la col1 de la ligne juste après, ou alors, son exemple d'ensemble de départ est un cas particulier

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    @Flodelarab : excellente remarque. C'est tout à fait ça. Je me suis mélangé les pinceaux avec le ZZ.
    Je reprends donc pour éclairer les admirateurs du site :

    En entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col1;col2
    CC;ZZ
    ZZ;BB
    BB;SS
    EE;QQ
    GG;WW
    WW;JJ
    En sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    col1;col2
    CC;SS
    ZZ;XX
    EE;QQ
    GG;JJ
    @disedorgue : non ce n'est pas linéaire. Il est possible d'avoir :
    En entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    col1;col2
    CC;ZZ
    AA;BB
    KK;SS
    ZZ;QQ
    BB;MM
    En sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1;col2
    CC;QQ
    AA;MM
    KK;SS
    J'ai une relation de petit-fils , fils et père.
    En gros, dans cet exemple, CC = petit fils, ZZ=fils et QQ=père. Je tente donc de relier le petit fils CC à son grand-père QQ en zappant le père.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Ok, peut-on aussi dire que:
    -une ligne ne doit être prise en compte qu'une et une seule fois
    -Il n'y a pas de doublon en col2
    -il n'y a pas de doublon en col1

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

Discussions similaires

  1. Améliorer la recherche dans un fichier?
    Par abdmaa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 09/05/2005, 13h09
  2. [LG]Runtime Error lors d'une recherche dans un fichier
    Par Fraynor dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2005, 22h51
  3. Rechercher dans un fichier avec emacs
    Par ggnore dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 10h28
  4. recherche dans un fichier xml (castor)
    Par pingoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 06/09/2004, 14h28
  5. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57

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