J'ai un grand fichier composé de champs de texte séparés par des points-virgules sous la forme d'un grand tableau. Il a été trié. J'ai un fichier plus petit composé des mêmes champs de texte. À un moment donné, quelqu'un a concaténé ce fichier avec d'autres, puis a fait un tri pour former le gros fichier décrit ci-dessus. Je voudrais soustraire les lignes du petit fichier du gros (c'est-à-dire pour chaque ligne du petit fichier, si une chaîne correspondante existe dans le gros fichier, supprimez cette ligne dans le gros fichier).
Le fichier ressemble à peu près à ceci
GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;
etc
Existe-t-il un moyen rapide et élégant de le faire ou dois-je utiliser awk?
la source
-x
option également, au cas où une ligne dans le fichier plus petit m'est arrivée une sous-chaîne d'une autre ligne dans le fichier principal. De plus, il est tout à fait possible que la réponse de @ UlrichSchwarz soit plus rapide.comm
est votre ami:(
comm
aura probablement un avantage de performance surgrep
car il tient compte du tri.)Par exemple:
la source
comm -1 -3 file.txt bigfile.txt > newbigfile.txt
comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)