Comparer 2 colonnes de 2 tableaux

Fermé
Helio4 - 9 nov. 2017 à 11:23
 Helios4 - 14 nov. 2017 à 14:50
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
A voir également:

3 réponses

UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
9 nov. 2017 à 11:52
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

0
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.
0
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157 > Helio4
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.
0
Helio4 > UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020
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!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 nov. 2017 à 12:15
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
0
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
0