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 :

parcourir 2 fichiers avec awk, et comparer 2 champs


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut parcourir 2 fichiers avec awk, et comparer 2 champs
    Bojour,

    J'ai 2 fichiers qui on chacun un champ ID, un numéro d'identification

    Je voudrais avec awk parcourir le fichier A et comparer le fichier B

    si ID de A == ID de B
    ecrire dans un fichier C le ID
    supprimer la ligne dans B

    Donc en résumé, j'ai un fichier A qui contient une base de données,
    et je reçois un fichier B qui contient des nouveaux enregistrements,
    mais si l'ID est déjà présent dans A, je veux supprimer du fichier update
    et dans un fichier externe garder une trace de l'anomalie.

    Avec awk j'arrive a parcourir un fichier, mais pas 2 au même temps.
    Est-ce possible?
    Sinon avec quelle commande serais-ce faisable?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par morphdown Voir le message
    Bojour,

    J'ai 2 fichiers qui on chacun un champ ID, un numéro d'identification

    Je voudrais avec awk parcourir le fichier A et comparer le fichier B

    si ID de A == ID de B
    ecrire dans un fichier C le ID
    supprimer la ligne dans B

    Donc en résumé, j'ai un fichier A qui contient une base de données,
    et je reçois un fichier B qui contient des nouveaux enregistrements,
    mais si l'ID est déjà présent dans A, je veux supprimer du fichier update
    et dans un fichier externe garder une trace de l'anomalie.

    Avec awk j'arrive a parcourir un fichier, mais pas 2 au même temps.
    Est-ce possible?
    Sinon avec quelle commande serais-ce faisable?

    Merci d'avance.
    awk a pour but de traiter un seul fichier. On peut en faire intervenir un 2° mais j'ai jamais tenté de le faire vu qu'il y a d'autres outils plus appropriés pour ça.

    Voici un algo de lecture de 2 fichiers en parallèle en shell
    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
    17
    18
    19
    20
    #!/bin/sh
     
    # Stockage des fichiers dans des buffers
    exec 3<fichier1
    exec 4<fichier2
     
    # Boucle de lecture
    while true
    do
        # Lecture des 2 fichiers à partir des buffers
        read lig1 0<&3
        read lig2 0<&4
     
        # Si fin des 2 fichiers
        test -z "$lig1" -a -z "$lig2" && break
     
        # Traitement des 2 lignes lues
        echo "$lig1"
        echo "$lig2"
    done
    Le même en Python
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python
     
    # Ouverture des fichiers
    f1=open("fichier1", "r")
    f2=open("fichier2", "r")
     
    # Boucle de lecture
    while True:
        # Lecture des 2 fichiers
        if f1 != False:
           lig1=f1.readline()
           if lig1 == "":
               f1.close()
               f1=False
     
        if f2 != False:
           lig2=f2.readline()
           if lig2 == "":
               f2.close()
               f2=False
     
        # Si fin des 2 fichiers
        if lig1 == "" and lig2 == "": break
     
        # Traitement des 2 lignes lues
        print "%s" % (lig1)
        print "%s" % (lig2)
    A partir de ces exemples simplistes, j'espère que tu pourras te programmer le traitement qui t'intéresse plus facilement. Par exemple l'appareillage est un algo connu de comparaison rapide de 2 fichiers en parallèles à condition que les fichiers soient tous deux triés.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    flag1=vrai
    flag2=vrai
    tant que
        si flag1
           lire fichier1
           flag1=faux
           si fin de fichier
               eof1=vrai
           fin si
     
        si flag2
           lire fichier2
           flag2=faux
           si fin de fichier
               eof2=vrai
           fin si
     
        si eof1 et eof2
           fin de boucle
        fin si
     
        si (not eof1 et clef fichier1 < clef fichier2) ou eof2
           <ici la clef du fichier1 n'est pas dans le fichier 2>
           <traitement à faire>
           flag1=vrai    # Le fichier1 a été traité, il faut passer au suivant
           continue
        fin si
     
        si (not eof2 et clef fichier2 < clef fichier1) ou eof1
           <ici la clef du fichier2 n'est pas dans le fichier 1>
           <traitement à faire>
           flag2=vrai    # Le fichier2 a été traité, il faut passer au suivant
           continue
        fin si
     
        # Ici les clefs sont égales, on se trouve sur 2 enregistrements égaux
        flag1=vrai
        flag2=vrai
        <éventuellement traitement à faire>
    fin tant que
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    En awk tu peux utiliser la fonction getline pour lire les lignes d'un autre fichier.

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci de vos réponses,
    finalement j'ai opté pour une solution avec join
    je mets ensemble les 2 fichiers, et là il est très simple
    de traiter ça avec awk qui parcours 1 seul fichier.

    Super merci pour l'algo. je le garde de coté,
    c'est toujours utile.

    Salutations.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bien que la discussion soit résolue, j'ai eu besoin récemment de comparer le contenu de deux fichiers en awk.
    C'est donc bien possible et assez simple, on peut même y insérer des conditions sur les valeurs.

    Je vous renvoie directement sur le sujet plutôt que de re-décrire le processus.
    www.developpez.net/forums/d1360479/systemes/linux/shell-commandes-gnu/comparer-contenu-deux-fichiers/#post7379092


    Cordialement,

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

Discussions similaires

  1. Extraire des valeurs d'un fichier avec AWK
    Par Maillon dans le forum Linux
    Réponses: 2
    Dernier message: 05/02/2009, 22h49
  2. traiter 2 fichier avec awk
    Par zcoul dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/03/2008, 18h28
  3. Lire un fichier avec awk
    Par lili2704 dans le forum Linux
    Réponses: 4
    Dernier message: 18/01/2007, 15h53
  4. problème formatage de fichier avec awk
    Par nenekes dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 02/11/2006, 12h53
  5. Formatage de fichier avec awk
    Par sam56 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 12/10/2006, 11h04

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