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 :

Afficher les différences entre les colonnes de 2 fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut Afficher les différences entre les colonnes de 2 fichiers
    Bonjour,

    Initialement, j'avais deux fichiers générés par un script dont je devais comparer le contenu (1 seul colonne par fichier). J'utilisais la commande "comm" pour afficher les différences dans les deux fichiers. Je n'avais pas de souci.

    Sauf que chaque fichier dispose dorénavant d'une colonne supplémentaire.

    Fichier index (colonne 1: Identifiant A/Colonne 2 : Identifiant B) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    510100;98110
    510025;98230
    510303;98150
    510400;97998
    525500;97450
    525750;97520
    525800;98751
    530920;94573

    Fichier Listing (Colonne 1 : Identifiant A) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    525500;LUPIN Arsene
    510303;COLUMBO Raphael
    510400;BAUER Jack
    525700;GYVER Mac
    525800;SMITH Hannibal

    Ce que je dois afficher à l'écran :

    1. Les agents présents dans Listing mais absents de Index : Afficher Identifiant A + Nom

    2. Les agents présents dans Index mais absents de Listing : Afficher leur Identifiant A et Identifiant B (indiqué dans le fichier Index)


    Le script sera lancé avec un ou plusieurs arguments sur 3 chiffres qui correspondra au service (3 premiers caractères de l'identifiant A). C'est à dire que l'affichage devra tenir compte du service indiqué. Inutile de polluer les réponses avec des utilisateurs d'un autre service. Exemple : nom du script 510 => les réponses devront tenir compte uniquement des identifiants commencant par 510. Bon pour ca, j'ai pensé à egrep "^$nomduservice" pour filtrer l'affichage.

    Auriez vous une piste pour m'aider svp ?

    Merci

  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,

    Citation Envoyé par heracles777 Voir le message
    Ce que je dois afficher à l'écran :
    1. Les agents présents dans Listing mais absents de Index : Afficher Identifiant A + Nom
    2. Les agents présents dans Index mais absents de Listing : Afficher leur Identifiant A et Identifiant B (indiqué dans le fichier Index)


    Le script sera lancé avec un ou plusieurs arguments sur 3 chiffres qui correspondra au service (...)
    bon à ce stade c'est une moulinette complète que tu dois faire, à moins de partager la fiche de paye ou la note du prof à la fin pas sûr que quelqu'un ait envie de faire le boulot à ta place, montre plutôt ce que tu as fais niveau code et on essaiera de corriger

    pour te donner des pistes, à moins qu'il ne s'agisse d'une contrainte forte le faire en awk plutôt qu'en bash est probablement un gain de temps et de rapidité, et si les fichiers ne font pas plusieurs Go tu peux envisager de les mettre en mémoire (créer un tableau en mémoire avec les données du premier fichier pour pouvoir traiter le second ligne par ligne ensuite en gros)

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Bonjour,

    Est-ce toutes les lignes, que cela soit dans index ou dans listing, ont une valeur pour chaque colonne ou bien une des colonnes peut-être vide ?

    Si pas de vide, il suffit de "merger" les 2 fichiers sur identifiant A ce qui te fera un fichier sur 3 colonnes. Ensuite il n'y aura plus qu'a extraire de ce fichier toutes les lignes qui possèdent une des 3 colonnes vides (dans les faits, il ne pourra y avoir que la colonne identifant b ou la colonne Nom de vide).

  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
    Citation Envoyé par disedorgue Voir le message
    il suffit de "merger" les 2 fichiers sur identifiant A
    oui, et l'ensemble du programme tient en 1 ligne relativement courte contrairement à ce que j'envisageais (ligne vide ou pas d'ailleurs, testé.)

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Par contre, à priori, dans son exemple, Arsène Lupin semble avoir pris l'identité de Mac Gyver ou alors c'est l'inverse... Va savoir avec ces 2 lascars.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Par contre, à priori, dans son exemple, Arsène Lupin semble avoir pris l'identité de Mac Gyver ou alors c'est l'inverse... Va savoir avec ces 2 lascars.
    J'ai rendu à Mac Gyver sa bonne identité

    En fait, ne maitrisant pas le awk, j'étais parti sur un join de ce style pour le point 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -t ';' -v 2 -1 1 -2 1  listing index
    Mais c vrai que c'est pas terrible car il ne me filtre pas directement les réponses par service (argument du script sur 3 caractères). Il faudra que je passe par un "egrep" ensuite...

    Je n'avais pas pensé au merge..je vais jeter un oeil sur les paramètres de cette commande.

    Merci

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Bon, essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; '{A[$1]=A[$1]";"$2}END{for (i in A){$0=i A[i];if(NF==2) print}}' listing index

  8. #8
    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
    Citation Envoyé par heracles777 Voir le message
    En fait, ne maitrisant pas le awk, j'étais parti sur un join
    oui, et t'as complètement raison, c'est moi qui ai pas été suffisamment perspicace plus haut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    IFS='|' args="$*"
    join -j1 -v1 -v2 -t';' <(sort -nk1 index) <(sort -nk1 listing) | grep -E "^(${args})"
    on trie les fichiers au préalable, on double l'option -v pour afficher ce qui manque dans les deux sens, le coup de l'IFS est un bonus, pour être strict on pourrait au minimum vérifier que chaque paramètre fait bien 3 caractères comme indiqué

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Pour compléter le awk pour qu'il ne filtre que le service demandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    args="$*"
    awk -vSRV="${args// /|^}" -F\; '{A[$1]=A[$1]";"$2}END{for (i in A){$0=i A[i];if(NF==2 && $1 ~ "^"SRV ) print}}' index listing

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bon, essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; '{A[$1]=A[$1]";"$2}END{for (i in A){$0=i A[i];if(NF==2) print}}' listing index
    Il m'affiche ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    530920;94573
    510025;98230
    525700;GYVER Mac
    525750;97520
    510100;98110
    Encore Mac qui f... le bordel !

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    oui, et t'as complètement raison, c'est moi qui ai pas été suffisamment perspicace plus haut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    IFS='|' args="$*"
    join -j1 -v1 -v2 -t';' <(sort -nk1 index) <(sort -nk1 listing) | grep -E "^(${args})"
    on trie les fichiers au préalable, on double l'option -v pour afficher ce qui manque dans les deux sens, le coup de l'IFS est un bonus, pour être strict on pourrait au minimum vérifier que chaque paramètre fait bien 3 caractères comme indiqué
    Très pratique ce join en effet!
    En fait, le but de tout ca est d'améliorer l'affichage du fichier log. Quand j'utilisais la commande "comm" (en commentaire dans le code ci-dessous), je disposais uniquement dans une partie du log des identifiants de LISTING qui n'étaient pas dans index et dans l'autre les identifiants de INDEX mais absents de listing (du service) :

    => Donc dans cette seconde partie, j'ai pu mettre ton join (en enlevant v2) [merci !] car on me demande uniquement d'afficher les identifiants A et B
    => Par contre, pour la première partie, je dois faire afficher le nom et le prenom à coté de l'identifiant A (ex : 525500 LUPIN Arsene)
    . Mais join me permet il d'afficher une colonne (nom prenom) qui n'est présente que ds un seul fichier?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    echo "*** Liste des agents présents dans LISTING mais absents de INDEX ***" | tee -a $LOG
    echo "* Matricule A | Nom-Prenom*"
    ????
    #comm -13 index listing 
    
    echo "*** Liste des agents présents dans INDEX mais absents de LISTING $SERV ***" | tee -a $LOG
    echo "* Ancien Matricule A | Nouveau Matricule B*" | tee -a $LOG
    IFS='|' 
    join -j1 -v1 -t';' <(sort -nk1 index) <(sort -nk1 listing) | grep -E "^(${SERV})"
    # comm -23  index listing  | egrep "^$SERV"  | tee -a $LOG

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Citation Envoyé par heracles777 Voir le message
    Il m'affiche ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    530920;94573
    510025;98230
    525700;GYVER Mac
    525750;97520
    510100;98110
    Encore Mac qui f... le bordel !
    Et cela pose un souci ?
    Je ne pense pas, car le il affiche la même chose que join (sans le grep) proposé par Bufferbob.

    PS: si tu regarde mon post précédent, le awk est dans un script bash qui prend en compte les param xxx yyy zzz.

  13. #13
    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
    Citation Envoyé par heracles777 Voir le message
    Par contre, pour la première partie, je dois faire afficher le nom et le prenom à coté de l'identifiant A (ex : 525500 LUPIN Arsene)
    t'as essayé en mettant -v2 à la place de -v1 ?

    Code man join : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           -v FILENUM
                  like -a FILENUM, but suppress joined output lines

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Citation Envoyé par heracles777 Voir le message
    Très pratique ce join en effet!
    En fait, le but de tout ca est d'améliorer l'affichage du fichier log. Quand j'utilisais la commande "comm" (en commentaire dans le code ci-dessous), je disposais uniquement dans une partie du log des identifiants de LISTING qui n'étaient pas dans index et dans l'autre les identifiants de INDEX mais absents de listing (du service) :

    => Donc dans cette seconde partie, j'ai pu mettre ton join (en enlevant v2) [merci !] car on me demande uniquement d'afficher les identifiants A et B
    => Par contre, pour la première partie, je dois faire afficher le nom et le prenom à coté de l'identifiant A (ex : 525500 LUPIN Arsene)
    . Mais join me permet il d'afficher une colonne (nom prenom) qui n'est présente que ds un seul fichier?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    echo "*** Liste des agents présents dans LISTING mais absents de INDEX ***" | tee -a $LOG
    echo "* Matricule A | Nom-Prenom*"
    ????
    #comm -13 index listing 
    
    echo "*** Liste des agents présents dans INDEX mais absents de LISTING $SERV ***" | tee -a $LOG
    echo "* Ancien Matricule A | Nouveau Matricule B*" | tee -a $LOG
    IFS='|' 
    join -j1 -v1 -t';' <(sort -nk1 index) <(sort -nk1 listing) | grep -E "^(${SERV})"
    # comm -23  index listing  | egrep "^$SERV"  | tee -a $LOG
    Ok, je comprends mieux ta remarque sur mon awk, mais je ne suis pas trop d'accord, soit plus explicite sur ton besoin:
    -Est-ce juste un exercice de style ?
    -Tu dois vraiment afficher sur l'écran ou bien répartir les cas dans des fichier à part ?

    Par principe, on essaye autant que possible à ne traiter qu'une fois un même fichier et donc, en ayant toutes les informations au départ, cela permet de prendre en considération tous les cas dans la façon de traiter le besoin.
    Si tu fais un traitement pour le cas 1 puis un traitement pour le cas 2, tu te retrouves à trier chaque fichier 2 fois pour les joindre et ensuite tu ne récupères qu'une seule partie (une pour chaque cas) alors que tu as déjà fais le travail.
    C'est loin d'être optimum comme façon de faire et le jour ou tu auras plusieurs Go à traiter...

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    t'as essayé en mettant -v2 à la place de -v1 ?

    Code man join : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           -v FILENUM
                  like -a FILENUM, but suppress joined output lines
    Oui mais n'a rien affiché à l'ecran.
    J'ai supposé qu'il faisait l'inverse : verifiait si les identifiants de listing etaient present dans index. Le cas echeant, il aurait affiché l'identifiant j'imagine (mais pas le nom)

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ok, je comprends mieux ta remarque sur mon awk, mais je ne suis pas trop d'accord, soit plus explicite sur ton besoin:
    -Est-ce juste un exercice de style ?
    -Tu dois vraiment afficher sur l'écran ou bien répartir les cas dans des fichier à part ?

    Par principe, on essaye autant que possible à ne traiter qu'une fois un même fichier et donc, en ayant toutes les informations au départ, cela permet de prendre en considération tous les cas dans la façon de traiter le besoin.
    Si tu fais un traitement pour le cas 1 puis un traitement pour le cas 2, tu te retrouves à trier chaque fichier 2 fois pour les joindre et ensuite tu ne récupères qu'une seule partie (une pour chaque cas) alors que tu as déjà fais le travail.
    C'est loin d'être optimum comme façon de faire et le jour ou tu auras plusieurs Go à traiter...
    Non ce n'est pas un exo de style.
    Le but est d'avoir un fichier log en ayant les 2 informations pour faciliter le debug si on trouve des différences dans les fichiers.
    Il n'y aura pas de nombreux Go à traiter dans la mesure où les fichiers n'ont pas vocation à grossir : il s'agit d'un projet de regroupement de services. A la fin, on veut savoir si tout le monde est bien là. D'où la volonté d'afficher les noms et prenoms pour faciliter le debug pour la premiere partie ("les agents présents dans Listing mais absents de Index")

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Bon, allez, comme j'avais 10 minutes à tuer:
    Les fichiers index et listing utilisés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat index 
    510100;98110
    510025;98230
    510303;98150
    510400;97998
    525500;97450
    525750;97520
    525800;98751
    530920;94573
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat listing 
    525500;LUPIN Arsene
    510303;COLUMBO Raphael
    510400;BAUER Jack
    525700;GYVER Mac
    525800;SMITH Hannibal
    Le script:
    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
    $ cat x1
    #!/bin/bash
    args="$*"
    awk -vSRV="${args// /|^}" -F\; '
    	$1 ~ "^"SRV {A[$1]=A[$1]";"$2}
    	END{
    		print "Ton laïus pour la partie index:"
    		for (i in A){
    			$0=i A[i]
    			if(NF==2){
    				if($2 ~ /^[0-9]*$/){
    					print
    				}
    				else{
    					B[$1]=$0
    				}
    			}
    		}
    		print "Ton laïus pour la partie nom:"
    		for (i in B){
    			print B[i]
    		}
    	}' index listing
    Exemple d'utilisation:
    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
    $ bash ./x1 525
    Ton laïus pour la partie index:
    525750;97520
    Ton laïus pour la partie nom:
    525700;GYVER Mac
    $ bash ./x1 510
    Ton laïus pour la partie index:
    510100;98110
    510025;98230
    Ton laïus pour la partie nom:
    $ bash ./x1 510 525
    Ton laïus pour la partie index:
    510100;98110
    510025;98230
    525750;97520
    Ton laïus pour la partie nom:
    525700;GYVER Mac
    EDIT: j'ai modifier le awk pour filtrer dés le départ les services (permet un gain mémoire limiter juste au services concernés)

  18. #18
    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
    Citation Envoyé par heracles777 Voir le message
    Oui mais n'a rien affiché à l'ecran.
    sur la base des fichiers modifiés par disedorgue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ join -j1 -v1 -t';' <(sort -nk1 index2) <(sort -nk1 listing2) | grep 525
    525750;97520
    $ join -j1 -v2 -t';' <(sort -nk1 index2) <(sort -nk1 listing2) | grep 525
    525700;GYVER Mac

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 51
    Par défaut
    Super Disedorgue, merci pour l'effort! Ca a l'air de fonctionné

    Merci à Buffer aussi, j'ai pas eu le tps de tester de voir pour quelle raison mon join v2 ne fonctionnait pas. Je me prends la tête depuis ce matin sur le script de Disedorgue afin d'effectuer une petite modif, en l'occurence changer le séparateur ";" pour "l'espace" (afin d'améliorer l'affichage ds le fichier log)

    1. Sur mes deux fichiers (index et listing), j'ai ôté les ";" via un sed.
    2. Dans le script de Disedorgue, j'ai remplacé les deux ";" par un espace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk -vORG="${ORG// /|^}" -F\  '
    	$1 ~ "^"ORG {A[$1]=A[$1]" "$2}
    a) => Le problème est que comme il y a un espace entre le nom et le prénom....Voilà ce que ca donne si je génère 2 erreurs (je supprime le matricule de lupin dans index + ajout d'un matricule 525xxx dans Index) : le prenom ne s'affiche plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    service traite : 525
     
    *** Liste des employés présents dans INDEX mais absents de LISTING $SRV ***
    ancien matricule    nouveau matricule
    525999 87520
    *** Liste des employés présents dans le LISTING $SRV mais absents de INDEX ***
    matricule    NOM
    525500 LUPIN
    b) => Après en termes d'affichage, vous constatez que j'ai un ptit problème de décalage avec mes entêtes. Dans le script, l'affichage se fait via un simple "print" dans la boucle... je n'ai pas la possibilité de formater l'affichage comme je veux du style "matricule:"xxx "nom :" dupont jean". (d'ailleurs je me demandais si dans le "print", je pouvais remplacer automatiquement les ";" par un "espace" pour m'éviter mon problème indiqué précedemment mais je ne pense pas?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if($2 ~ /^[0-9]*$/){
    					print "ancien matricule    nouveau matricule"
    					print 
    				}
    
    for (i in B){
     
    		print "matricule    NOM"
    			print B[i]
    		}
    N.B: Dise, pour le "gain en mémoire, je ne l'avais pas précisé pour ne pas vous polluer avec un truc non crucial mais j'ai plusieurs fichiers listings.csv selon le nom du service : (listing_<srv>.csv). Donc à la saisie de l'argument, c'est le fichier en question qui sera traité.

    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
     
    for SRV in $LISTE_SRV
    do
    	echo 
    	echo "service traite : $SRV" 
    	echo
    	if [ -r listing_$SRV.CSV ]
    	then
     
    awk -vSRV="${SRV// /|^}" -F\  '
    	$1 ~ "^"SRV {A[$1]=A[$1]" "$2}
    	END{
    		print "*** Liste des employés présents dans INDEX mais absents de LISTING $SRV ***"
     
    		for (i in A){
    			$0=i A[i]
    			if(NF==2){
    				if($2 ~ /^[0-9]*$/){
    					print "ancien matricule    nouveau matricule"
    					print 
    				}
    				else{
    					B[$1]=$0
    				}
    			}
    		}
    		print "*** Liste des employés présents dans le LISTING $SRV mais absent de INDEX ***"
    		for (i in B){
     
    		print "matricule    NOM"
    			print B[i]
    		}
    	}' index listing
    	else
    		echo "Pas de fichier lisible listing_$SRV.CSV"
    		exit 2
     
    	fi
    done
    Merci!

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Pas trop le temps de regarder là, mais en gros, faut laisser le ';' comme séparateur dans les fichiers listing et index et modifier la sortie du awk.
    Ce qui donne quelque chose ressemblant à ça (pas testé du tout) :
    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
    awk -vSRV="${args// /|^}" -F\; '
    	$1 ~ "^"SRV {A[$1]=A[$1]";"$2}
    	END{
    		OFS=" "
    		print "Ton laïus pour la partie index:"
    		for (i in A){
    			$0=i A[i]
    			if(NF==2){
    				if($2 ~ /^[0-9]*$/){
    					print "INDEX:"$1" IDEN:"$2
    				}
    				else{
    					B[$1]=$0
    				}
    			}
    		}
    		print "Ton laïus pour la partie nom:"
    		for (i in B){
    			$0=B[i]
    			print "INDEX:"$1" NOM:"$2
    		}
    	}' index listing
    Et pour plus de souplesse dans l'affichage, awk à une fonction printf...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/06/2009, 12h04
  2. Réponses: 12
    Dernier message: 03/03/2009, 09h01
  3. [EJB] Différence entre les EJB et les JavaBeans
    Par cool dans le forum Java EE
    Réponses: 6
    Dernier message: 22/05/2008, 20h24
  4. [C#] Diffèrence entre les structures et les classes
    Par Kr00pS dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/08/2006, 12h42

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