Signaler

Comparer 2 colonnes de 2 tableaux

Posez votre question Helio4 - Dernière réponse le 14 nov. 2017 à 14:50 par Helios4
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.

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

Fichier index (colonne 1: Identifiant A/Colonne 2 : Identifiant B)  :
51010;98110
52500;98230
52503;98150
53800;97998
57900;97450
58450;97520
58900;98751
59120;94573


Fichier Listing (Colonne 1 : Identifiant A)  :
52500;LUPIN Arsene
53800;COLUMBO Raphael
57900;BAUER Jack
58450;GYVER Mac
58900;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)

Auriez vous une piste pour m'aider svp ?

Merci
Utile
+0
plus moins
Salut,

Voir avec la commande join :

$ cat fichA
51010;98110
52500;98230
52503;98150
53800;97998
57900;97450
58450;97520
58900;98751
59120;94573

$ cat fichB
52500;LUPIN Arsene
53800;COLUMBO Raphael
57900;BAUER Jack
58450;GYVER Mac
58900;SMITH Hannibal

$ join -t ';' -1 1 -2 1 -o 1.1,1.2 fichB fichA
52500;LUPIN Arsene
53800;COLUMBO Raphael
57900;BAUER Jack
58450;GYVER Mac
58900;SMITH Hannibal

$ join -t ';' -v 2 -1 1 -2 1 fichB fichA
51010;98110
52503;98150
59120;94573

Helio4- 9 nov. 2017 à 13:00
Edit : "J'ai oublié de préciser que le script était lancé avec en paramètre un ou pls codes services sur 3 caractères (qui correspond aux 3 premiers chiffres de l'identifiant A (première colonne). Ex: 510."

Merci UnGnU pour ta réponse. En fait, ton deuxième join correspondrait à la demande 2 mais le premier "join" ne semble pas OK car il affiche les utilisateurs qui sont pourtant bien présents dans le premier fichier (index). Néanmoins, en cherchant ds les paramètres de join, je vais bien trouver.

Néanmoins pour mon "EDIT", à savoir filtrer les réponses en tenant compte de l'argument saisi (3 premiers caractères), je ne peux pas coller dans mon join un egrep "^argument sur 3 caractères" pour filtrer l'affichage ? Faut le faire en deux temps ?

Sinon il y a certainement moyen avec un awk...encore faut il le trouver.
Répondre
UnGnU 575Messages postés lundi 2 mai 2016Date d'inscription 24 novembre 2017 Dernière intervention - 9 nov. 2017 à 13:20
Effectivement, avec un paramètre à prendre en compte, la commande join n'est plus du tout appropriée et awk me semble tout indiqué.

Reste plus qu'à attendre le passage du spécialiste, le bien nommé dubcek.
Répondre
Helio4- 9 nov. 2017 à 14:20
Sinon j'etais en train de me dire que je pourrais passer par un ou deux fichiers intermédiaires :

j'utilise un join que je renvoie vers un fichier tempo 1.
Ensuite je filtre ce dernier par un egrep....

mais bon c vrai que ca serait mieux avec un awk!
Répondre
Donnez votre avis
Utile
+0
plus moins
hello
essayer
pour toutes les lignes qiui commencentt par $VAR
agents présents dans Listing mais absents de Index
$ VAR=510; awk -F ";" -v v=$VAR '$1 !~ "^" v {next} NR==FNR {t[$1]=$0; next} !t[$1] {print $0}' Index Listing 

agents présents dans Index mais absents de Listing
$ VAR=510; awk -F ";" -v v=$VAR '$1 !~ "^" v {next} NR==FNR {t[$1]=$0; next} !t[$1] {print $0}' Listing Index

même code, mas l'ordre des fichiers change
Donnez votre avis
Utile
+0
plus moins
Merci dub pour ta réponse.

En fait, juste avant que tu répondes, j'avais trouvé ceci, cela semble être OK.
Pour l'une de requetes, je devais afficher l'identifiant A + Nom de l'user.
et pour la seconde requête, afficher uniquement l'identifiant A et B.

args="$*"
awk -vSRV="${args// /|^}" -F\; '
$1 ~ "^"SRV {A[$1]=A[$1]";"$2}
END{
print "Liste des agents présents dans index mais absents de listing:"
for (i in A){
$0=i A[i]
if(NF==2){
if($2 ~ /^[0-9]*$/){
print
}
else{
B[$1]=$0
}
}
}
print "Liste des agents présents dans listing mais absent de index:"
for (i in B){
print B[i]
}
}' index listing


Merci
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !