Je souhaite effectuer ce que certains logiciels danalyse de données appellent une anti-jointure: supprimer dune liste ces lignes lignes correspondantes dans une autre liste. Voici quelques données sur les jouets et le résultat attendu:
$ echo -e "a\nb\nc\nd" > list1 $ echo -e "c\nd\ne\nf" > list2 $ antijoincommand list1 list2 a b
Commentaires
- Relatif unix.stackexchange.com/q/11343/117549
- Cela répond-il à votre question? Existe-t-il un outil pour obtenir les lignes dun fichier qui ne sont pas dans un autre?
- @Muru, oui, cet article fournit les solutions présenté dans la réponse de Terdon '. Cependant, lorsque je cherchais " bash anti-join " (la terminologie que jassocie à ce type de processus), je nai pas ' Je ne trouve rien dutile. Mon OP (que dautres ont modifié) a déclaré que mon objectif explicite en posant cette question était dassocier le terme " anti-join " à les solutions, de sorte que la recherche de ce terme donne ces solutions. Merci.
Réponse
Je nutiliserais pas join
pour cela, car join
nécessite le tri des entrées, ce qui est une complication inutile pour un travail aussi simple. Vous pouvez à la place utiliser grep
:
$ grep -vxFf list2 list1 a b
Ou awk
:
$ awk "NR==FNR{++a[$0]} !a[$0]" list2 list1 a b
Si les fichiers sont déjà triés, une alternative à join -v 1
serait comm -23
$ comm -23 list1 list2 a b
Commentaires
- Éviter
sort
avecgrep
est génial pour les données de jouet que jai fournies. Merci! Dans le monde réel, mon fichier1 contient souvent plusieurs colonnes de données, dont lune est utilisée pour la jointure. Une version modifiée de votreawk
le code répondrait à ce cas dutilisation. - @Josh oui, il suffit de changer
$0
par$N
oùN
est le numéro de champ sur lequel vous rejoignez. - Cela fonctionne même si les numéros de colonne dans file1 et file2 sont différents: comme awk ' NR == FNR {++ a [$ 2]}! a [$ 5] ' list2 list1; tout à fait habituel que le fichier de balise ait un format différent des données principales.
Réponse
Une façon de faites ceci avec lutilitaire join
est:
$ join -v 1 list1 list2 a b