AWK : Doublons sur deux fichiers différents
Résolu
loic.gpr
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
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!!
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!!
A voir également:
- AWK : Doublons sur deux fichiers différents
- Awk dédoublonner un print ✓ - Forum Shell
- SED ou Awk sous windows ?? - Forum Windows
- Suppression de lignes en awk ✓ - Forum Shell
- Awk : tri selon la date ✓ - Forum Shell
- Awk : remplacement d'un élément conditionnel - Forum Shell
6 réponses
hello
avec awk (plus lourd, mais les fichiers n'ont pas à être triés)
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 $
Salut,
awk est obligé ? Parce qu'avec "join" ça le fait plus que simplement :
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 $
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 ^^
Comfirmation : Dubcek, tu es très fort ! ^^ ! En effet la 2ème solution proposée fonctionne à merveille , encore merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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