AWK : Doublons sur deux fichiers différents [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013
-
Messages postés
18224
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 septembre 2020
-
Bonjour,

j'ai un premier fichier du type :

aaaa ; 55555 ; rere
bbbb ; 66666 ; tete
cccc ; 77777 ; fefe
dddd ; 88888 ; pepe

et un deuxième fichier du type :

aaaa ; ppp ; 01
bbbb ; rrr ; 02
cccc ; aaa ; 03
dddd ; zzz ; 04
eeee ; ooo ; 05
ffff ; qqq ; 06

dans mon cas, si le 1er champ est identique dans chacun des fichiers, alors ils sont considérés comme doublons

en utilisant awk je voudrais créer un 3eme fichier ne regroupant que les lignes uniques, donc le résultat serait :

eeee ; ooo ; 05
ffff ; qqq ; 06

Si quelqu'un connait une solution pour résoudre ce problème, je suis preneur !

Merci déjà pour votre aide!!

6 réponses

Messages postés
18224
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 septembre 2020
5 005
hello
avec awk (plus lourd, mais les fichiers n'ont pas à être triés)
$ awk -F" *; *" '{t[$1]++; t2[NR]=$0} END{for(n=1; n<=NR;){$0=t2[n++]; if(t[$1]==1)print}}' fichier1 fichier2
eeee ; ooo ; 05
ffff ; qqq ; 06 
$ 
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60769 internautes nous ont dit merci ce mois-ci

Messages postés
35632
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
26 septembre 2020
5 472
Salut,

awk est obligé ? Parce qu'avec "join" ça le fait plus que simplement :

$ cat f1 
aaaa ; 55555 ; rere
bbbb ; 66666 ; tete
cccc ; 77777 ; fefe
dddd ; 88888 ; pepe 

$ cat f2
aaaa ; ppp ; 01
bbbb ; rrr ; 02
cccc ; aaa ; 03
dddd ; zzz ; 04
eeee ; ooo ; 05
ffff ; qqq ; 06 

$ join -t';' -v 2 -1 1 -2 1 f1 f2
eeee ; ooo ; 05
ffff ; qqq ; 06 

$ 

Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013

merci de ta reponse dubcek je vais essayer ces deux solutions de suite , car non awk n'est aps obligé ; c'est marrant ayant parcouru le forum pour chercher des solutions, je me doutais que ce serait toi qui me proposerait la réponse ^^
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013

Comfirmation : Dubcek, tu es très fort ! ^^ ! En effet la 2ème solution proposée fonctionne à merveille , encore merci.
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013

merci aussi a zipe31 bien sur
Messages postés
18224
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 septembre 2020
5 005
explication du code
-F" *; *"  définit <0 ou plusieurs espaces><point virgule><0 ou plusieurs espaces> comme séparateur
{t[$1]++; t2[NR]=$0}       t contient un compteur de chaque champ 1 de tous les fichiers, t2 stocke chaque ligne de chaque fichier
END{for(n=1; n<=NR;)       un fois tous les fichiers lus, on boucle de 1 au nombre de ligne total (NR)
{$0=t2[n++];       on copie la ligne t2[n] (et on incrémente n) dans $0, donc awk va séparer les champs ($1, $2, $3, etc)
if(t[$1]==1)print}  si le compteur de champ 1 de cette ligne est 1, le champs 1 n'est présent qu'une fois, on imprime