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 :

Comparaison de deux fichiers avec awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut Comparaison de deux fichiers avec awk
    Bonjour , je souhaite comparer deux fichiers sur un champ bien précis . Les deux fichiers sont structurés avec des champs fixes pas de séparateur entre chaque champ.

    Sur le premier fichier ( par ex fichier1.txt) le champ qui m 'intéresse se trouve en position suivante : colonne de 1 à 8 .

    Sur le deuxième fichier ( par ex fichier2.txt) le champ qui m 'intéresse se trouve en position suivante : colonne de 13 à 21 .

    je souhaite donc comparer ces deux champ et afficher le résultat dans un fichier . comment je dois procéder merci de votre aide .

    j'ai fait un truc comme ça , ça ne marche pas très bien , une idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    awk ' { cle1=substr($0,1,8);   
                              if (cle1==cle2)
                    {
                                                   print $0
                    }
                    while  ((getline < "fichier2.txt") > 0) {
                                  cle2=substr($0,13,8);
                                                  if (cle1==cle2) 
                                   {
                                                   print $0
                                   }
                                 } 
    }'  fichier1.txt. > res.txt

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Salut,
    En supposant que le séparateur est un point-virgule quelque chose comme ceci devrait faire l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk -F';' '{ getline Fichier2 < "/path/to/second-file" ; split(Fichier2,F2s,";") ; SF2=F2s[5]F2s[6]F2s[7] ; SF1=$5$6$7 ; if( SF1 !~ SF2 ) { print "DONT MATCH - " SF1 "#--##" SF2  } }' /path/to/first-file

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

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

    Les deux fichiers sont structurés avec des champs fixes
    gawk possède une variable FIELDWIDTHS.

    ça ne marche pas très bien
    c'est-à-dire ?
    quel est le comportement attendu ?
    quel est le comportement observé ?
    un échantillon représentatif des fichiers à traiter et la sortie correspondante seraient appréciés.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    Re,
    voici un échantillon pour chaque fichier

    structure premier Fichier : aucun séparateur que des champs fixes, les valeurs sont tjs à la même position

    ex des données :

    00000001 0100122223
    00000002 0100122224
    00000003 0100122226

    le champ que je souhaite comparer avec le deuxième fichier est positionnée en gras se sont les 8 premiers caractères du fichier

    Struture du deuxième fichier : aucun séparateur que des champs fixes les valeurs sont tjs à la même position

    ex de données :

    L2204 01001 L ABERGEMENT CLEMENCIAT 0 101400L ABERGEMENT CLEMENCIAT
    V2204 0100100000001 CLEMENCIAT CLEMENCIAT N 000014000000 0000 0000 0000 00000
    V2204 0100100000002 BOIS LIEU DIT AU BOIS LD VVAN 000014000000 0000 0000 0000 00002
    V2204 0100100000003 CHAMAUDRY CHAMAUDRY N 000014000000 0000 0000 0000 00000

    Le champ que je souhaite comparer avec le premier fichier est tjs positionné de la colonne 13 à la colonne 20( taille 8)

    Donc ma demande , si le champ du premier fichier identifié en gras position de 1 à 8( ci-dessus) est présent dans le deuxième fichier(colonne13 à 20) , alors créer un fichier de résultat on y rajoutant la ligne du premier fichier
    Merci de votre aide

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    la fonction substr() est ton amie, sur le même principe décrit par becket plus haut
    une façon de faire assez simple :
    Code script.awk : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/awk -f
     
    NR == FNR {  # on traite le 1er fichier, on rempli un tableau
       tab[substr($0, 1, 8)] = $0;
       next;
    }
     
    tab[substr($0, 12, 8)] { # on traite le 2nd fichier, pour chaque valeur on cherche dans le tableau
       print tab[substr($0, 12, 8)];
    }

    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./script.awk fichier1.txt fichier2.txt > res.txt
    $ cat res.txt
    00000001 0100122223
    00000002 0100122224
    00000003 0100122226

  6. #6
    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 ferai un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Traite le 1er fichier ligne par ligne
    while read LigneFichier1
    do
      # Traite le second fichier ligne par ligne pour chaque ligne du 1er fichier
      while read LigneFichier2
      do
        # Compare les valeurs des 2 fichiers et rempli le fichier de retour
        [[ ${LigneFichier1:0:8} == ${LigneFichier2:11:8} ]] && echo "${LigneFichier}" >> reply.txt
      done < fichier2.txt
    done < fichier1.txt
    ce qui me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat reply.txt
    00000001 0100122223
    00000002 0100122224
    00000003 0100122226
    mais bon ça ne répond pas vraiment à la question qui évoquait awk :p

Discussions similaires

  1. AWK table hashage et comparaison entre deux fichiers
    Par Shyma dans le forum Shell et commandes GNU
    Réponses: 33
    Dernier message: 26/06/2017, 16h06
  2. [Python 3.X] Comparaison de deux fichiers txt avec une reponse IDENTIQUE: oui ou non
    Par pascaljqt dans le forum Général Python
    Réponses: 5
    Dernier message: 28/07/2015, 23h09
  3. Comparaison deux fichiers avec cobol
    Par Babylone159 dans le forum Cobol
    Réponses: 5
    Dernier message: 03/09/2012, 12h36
  4. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52

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