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 et comparer des champs avec awk ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Points : 10
    Points
    10
    Par défaut Parcourir et comparer des champs avec awk ?
    Bonjour,

    J'ai deux fichiers plats de ce format :

    Libelle;nomFichier;nomFichier;nomFichier;nomFichier

    Il peut y avoir de 1 à n nomFichier.

    En premier lieu, je compare le premier champs entre les 2 fichiers (champs 'Libelle'), ça je sais faire . S'ils sont identiques, alors je souhaite comparer les autres champs un à un entre les 2 fichiers. J'ai l'algo mais pas la syntaxe !

    Je souhaite parcourir les champs du premier fichier et les comparer un à un avec les champs du second fichier (à l'aide d'une boucle).

    Seulement je ne vois pas comment faire, quelle commande utiliser ...

    Merci de votre réponse.

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Bonjour,

    Peux-tu donner une exemple de fichiers en entrée et la sortie souhaité, se sera plus claire à comprendre...

  3. #3
    Membre habitué
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Points : 185
    Points
    185
    Par défaut
    tu ne précises pas très bien l'objectif, mais avec juste ta demande, moi je ferais ceci :

    je transforme les 2 fichiers A.txt et B.txt dans le format:
    libellé;nomFicher
    (sans oublié que cela doit etre trié)

    et je comparerais avec un
    diff A.txt B.txt

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Bonjour

    Est-ce que le libellé est une clé primaire?
    Est-ce que le champ 3 du fichier 1 doit être comparer au champ 3 du fichier 2 ou à tous les champs du fichier 2?
    De quelle comparaison s'agit-il? Égalité? Ordre alphabétique?
    Toutes les lignes de tous les fichiers ont-ils le même nombre de champs?
    Les fichiers ont-ils le même nombre de lignes?

    Avec des champs si bien délimités, j'utiliserais awk.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Désolé pour le temps de réponse

    disedorgue :
    voici un exemple de fichier en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    libelle1;nomfichier1;nomfichier2;nomfichier3
    libelle2;nomfichier1;nomfichier2;nomfichier3;nomfichier4
    libelle3;nomfichier1;nomfichier2
    libelle4;nomfichier1;nomfichier2;nomfichier3;nomfichier4;nomfichier5
    libelle5;nomfichier1;nomfichier2;nomfichier3;nomfichier4
    J'ai donc 2 fichiers de ce type que je dois comparer. Chaque ligne contient un libelle et un nombre de champs 'nomfichier' indéfini. Je dois d'abord comparer le 1er champs (libellé), et si ceux-là sont identiques entre les 2 fichiers, alors je vérifier que les champs 'nomfichier' sont présents dans les 2 fichiers. En clair, un même libellé dans ces 2 fichiers doit contenir les mêmes champs (champs 'nomfichier'), qu'ils soient dans l'ordre ou non.

    En sortie, on a par exemple un autre fichier contenant 2 champs par ligne. Le premier concernerait le champs 'libellé' (des 2 fichiers de comparaison), puis le second serait un booléen à true ou false selon le résultat de la comparaison des champs 'nomfichier' entre les 2 fichiers.

    qqcvd : je ne souhaite pas comparer les 2 fichiers globalement mais bien ligne par ligne. Je m'étais certain'ment mal exprimé

    Flodelarab :
    Est-ce que le libellé est une clé primaire?
    Non, le libellé ne peut se retrouver 2 fois dans le même fichier.

    Est-ce que le champ 3 du fichier 1 doit être comparer au champ 3 du fichier 2 ou à tous les champs du fichier 2?
    à tous les champs du fichier 2, sauf si un des champs comparés est déjà identique, dans ce cas-là on arrête le traitement de comparaison sur ce champs.

    De quelle comparaison s'agit-il? Égalité? Ordre alphabétique
    Il s'agit d'une comparaison de chaînes de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Toutes les lignes de tous les fichiers ont-ils le même nombre de champs?
    Non, le nombre de champs est indéfini, par ailleurs il n'y a qu'un seul libellé par ligne, c'est en fait le critère de lettrage entre les 2 fichiers.

    Les fichiers ont-ils le même nombre de lignes?
    Non, certains libellés peuvent être présents dans un fichier mais pas dans l'autre.

    Merci

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Bonjour,

    Pour faire simple, il sufffirait de trier les champs de chaque ligne dans les 2 fichiers et ensuite un "simple" sort et uniq donnerait les différences...

    Questions:
    -Doit-on respecter la casse ?
    -Si un libellé n'existe pas dans un des fichiers, est-ce un true ou un false ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Bonjour disedorgue,

    Pour faire simple, il sufffirait de trier les champs de chaque ligne dans les 2 fichiers et ensuite un "simple" sort et uniq donnerait les différences...
    Je ne vois pas comment trier uniquement les champs 'nomfichier' sur chaque ligne, sinon effectiv'ment il suffit ensuite de comparer la ligne entière et non plus par champs

    -Doit-on respecter la casse ?
    Non je ne prend pas en compte la casse, je les compare en appliquant la fonction 'upper' sur les champs.

    -Si un libellé n'existe pas dans un des fichiers, est-ce un true ou un false ?
    Si un libellé n'est pas présent dans un des fichiers on n'en tient pas compte et cela n'affecte pas la variable booléenne. On affecte la variable booléenne seulement si les libellés sont identiques, et donc elle passe à true si tous les champs sont identiques entre les 2 fichiers, ou false si les champs ne le sont pas, ou s'il manque un champs sur un fichier...

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    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
    $ cat text.txt
    libelle1;nomfichier1;nomfichier2;nomfichier3
    libelle2;nomfichier1;nomfichier2;nomfichier3;nomfichier4
    libelle3;nomfichier1;nomfichier2
    libelle4;nomfichier1;nomfichier2;nomfichier3;nomfichier4;nomfichier5
    libelle5;nomfichier1;nomfichier2;nomfichier3;nomfichier4
    libelle6;nomfichier2;nomfichier3;nomfichier7
    $ cat text2.txt
    libelle3;nomfichier1;nomfichier2
    libelle1;nomfichier2;nomfichier1;nomfichier3
    libelle4;nomfichier1;nomfichier4;nomfichier5;nomfichier2;nomfichier3
    libelle5;nomfichier3;nomfichier4;nomfichier1;nomfichier2
    libelle2;nomfichier1;nomfichier2;nomfichier3;nomfichier4
    libelle6;nomfichier2;nomfichier3;nomfichier4
    $ awk '{tab[toupper($0)]++} END{for (i in tab) if (tab[i]>1) {c=i;sub(/;.*/,";True",c);print c} else if (tab[i]==1) {c=i;sub(/;.*/,";False",c);print c} }' <(while read ligne;do sed 's/;/\n/g'<<<$ligne|sort|sed ':z;N;$!bz;s/\n/;/g';done<text2.txt|sort) <(while read ligne;do sed 's/;/\n/g'<<<$ligne|sort|sed ':z;N;$!bz;s/\n/;/g';done<text.txt|sort)|sort -u
    LIBELLE1;True
    LIBELLE2;True
    LIBELLE3;True
    LIBELLE4;True
    LIBELLE5;True
    LIBELLE6;False

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    C'est parfait !

    Merci pour votre aide

    Bonne journée

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Erratum: Tous les sort doivent être des sort -u

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

Discussions similaires

  1. [XL-2010] Regex - Comparer des champs avec des balises de séparation aléatoires
    Par Michocs17141 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/09/2014, 11h58
  2. [awk] Extraire des champs avec plusieurs séparateurs différents
    Par leon1983 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/11/2013, 17h20
  3. Comparer des champs
    Par nicoreims dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/06/2006, 22h22
  4. Réponses: 3
    Dernier message: 23/10/2005, 23h06
  5. comparer des champs date time
    Par HULK dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/01/2005, 15h02

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