AWK : Doublons sur deux fichiers différents
Résolu/Fermé
loic.gpr
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013
-
9 août 2013 à 12:15
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 22 août 2013 à 08:11
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 22 août 2013 à 08:11
A voir également:
- AWK : Doublons sur deux fichiers différents
- Ps awk ✓ - Forum Debian
- Awk supprimer ligne contenant chaîne ✓ - Forum Shell
- Awk windows - Forum Windows
- Awk separateur ✓ - Forum Shell
- Awk cut ✓ - Forum Shell
6 réponses
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
9 août 2013 à 13:26
9 août 2013 à 13:26
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 $
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 407
9 août 2013 à 12:29
9 août 2013 à 12:29
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 $
loic.gpr
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013
9 août 2013 à 13:42
9 août 2013 à 13:42
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 ^^
loic.gpr
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013
9 août 2013 à 13:58
9 août 2013 à 13:58
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
loic.gpr
Messages postés
6
Date d'inscription
mardi 6 août 2013
Statut
Membre
Dernière intervention
13 août 2013
9 août 2013 à 14:35
9 août 2013 à 14:35
merci aussi a zipe31 bien sur
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
22 août 2013 à 08:11
22 août 2013 à 08:11
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