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 :

[awk] Comparaison par colonne de deux tableaux


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    24
    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 : 24
    Par défaut [awk] Comparaison par colonne de deux tableaux
    Bonjour à tous,

    Je débute sous Awk et j'ai un petit souci concernant l'utilisation des tableaux.

    J'ai deux fichiers CSV en entrée contenant chacun 4 lignes de 5 colonnes (fich1.csv & fich2.csv).

    #cat fich1.csv
    A b c d e
    F g h i j
    K l m n o
    P q r s t

    #cat fich2.csv
    A b c d e
    F g h z j
    K l m n o
    P z r s t

    La colonne 1 (AFKP) sera toujours identique aux deux fichiers .
    Je désire comparer le contenu de chaque colonne afin que le résultat donne :

    L'identifiant F est différent à la colonne 4
    L'identifiant P est différent à la colonne 2

    Je pense que Awk est l'idéal car j'ai des milliers de lignes et ça ma l'air très rapide, par contre je m'arrache les cheveux !
    J'ai réussi à mettre en tableau un fichier mais impossible d'en mettre deux et en encore moins de les comparer.

    Merci d'avance pour vos lumières...

  2. #2
    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,

    un fichier CSV c'est censé être des valeurs séparées par des virgules, dans ton exemple tu sépares par des espaces, dans le doute j'ai mis une variable sep modifiable facilement :

    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 -vsep=',' '
    NR == FNR {
      f1[NR] = $0;
      next;
    }
     
    $0 != f1[FNR] {
      n=split(f1[FNR],lf1,sep);
      split($0,lf2,sep);
      for (i=1; i<=n; i++) {
        if (lf1[i] != lf2[i]) {
          printf("L\047identifiant %s est différent à la colonne %d\n", lf1[1], i);
        }
      }
    }' fich1.csv fich2.csv
    (tout le code peut évidemment tenir sur la même ligne)

    on passe les deux fichiers en paramètre directement, la condition NR == FNR est un trick qui permet de rentrer dans le bloc uniquement si le fichier lu est le premier fichier passé en paramètre (donc fic1.csv), à chaque ligne lue on la stocke dans le tableau f1, et on passe à la ligne suivante avec next pour éviter de rentrer dans le second bloc qui lui sert à traiter fic2.csv

    dans le second bloc, on éclate chaque ligne dans un tableau, lf1 pour la ligne issue du fichier fic1.csv, lf2 pour la ligne issue de fic2.csv
    reste plus qu'à comparer chaque colonne dans une boucle for, si les champs sont différents on affiche un message, on notera au passage le \047 en octal pour pouvoir afficher l'apostrophe dans L'identifiant

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat fi1
    A b c d e
    F g h i j
    K l m n o
    P q r s t
    $ cat fi2
    A b c d e
    F g h z j
    K l m n o
    P z r s t
    $ awk '(NR==FNR){for (i=1;i<=NF;i++) a[FNR,i]=$i;next;} {for (i=1;i<=NF;i++) if ($i!=a[FNR,i]) printf "La ligne %i est différente à la colonne %i.\n",FNR,i;}' fi1 fi2
    La ligne 2 est différente à la colonne 4.
    La ligne 4 est différente à la colonne 2.

  4. #4
    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
    j'en apprends (ou réapprends) tous les jours, j'avais complètement oublié qu'on pouvait faire ça avec le tableau, bien vu

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur Système Linux
    Inscrit en
    Juillet 2009
    Messages
    24
    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 : 24
    Par défaut La Ferrari Awk...
    @BufferBob & Flodelarab : Merci infiniment, vous êtes des As !

    J'ai testé et ça marche du feu de Dieu ;
    Des centaines de milliers de lignes traitées en quelques millisecondes, c'est incroyable !

    Je suis surpris chaque jour de la puissance de traitement de Linux en général et de ce langage en particulier.
    Mais j'ai encore du pain sur la planche pour en comprendre toutes les subtilités...

    Par exemple, certaine ligne ont deux champs différents (au lieu de un) et je planche maintenant sur la façon d'arriver à :

    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
    #cat fich1.csv
    A;b;c;d;e
    F;g;h;i;j
    K;l;m;n;o
    P;q;z;s;t
     
    #cat fich2.csv
    A;b;c;d;e
    F;z;h;z;j
    K;l;m;n;o
    P;z;r;z;t
     
     
    L'identifiant F est différent à la colonne 2, 4
    L'identifiant P est différent à la colonne 2, 3, 4

    @+
    Lucky

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Suffit de concaténer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat fi1
    A b c d e
    F g h i j
    K l m n o
    P q r s t
    $ cat fi2
    A b c d e
    F g h z j
    K l m n o
    P j j j j
    $ awk '(NR==FNR){for (i=1;i<=NF;i++) a[FNR,i]=$i;next;} {s="";for (i=1;i<=NF;i++) if ($i!=a[FNR,i]) if (s!="") s=s", "i; else s=i;if (s!="") printf "La ligne %i est différente à la colonne %s.\n",FNR,s;}' fi1 fi2
    La ligne 2 est différente à la colonne 4.
    La ligne 4 est différente à la colonne 2, 3, 4, 5.
    Avec un -F';' en prime, au besoin.

Discussions similaires

  1. [PHP 5.3] Additionner les valeurs de certaines colonnes de deux tableaux
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 29/05/2014, 23h31
  2. Associer deux colonnes de deux tableaux html différents
    Par clementdevelop dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 18/05/2013, 19h13
  3. Comparaison des colonnes de deux tables différentes
    Par Chakalaka dans le forum PL/SQL
    Réponses: 11
    Dernier message: 22/11/2011, 17h27
  4. [XL-2003] Comparaison de nombres entre deux tableaux
    Par boxtom dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/07/2010, 15h12

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