2011-09-30 7 views
2

J'essaie de soustraire List_1 (50k lignes) de List_2 (100k lignes), quand un élément de List_1 correspond exactement à un élément de List_2. J'utilise grep, plus précisément:Quel est le moyen le plus efficace de soustraire une liste à une autre?

grep -v -f List_1.csv List_2.csv > Magic_List.csv

Je sais que ce n'est pas la façon la plus efficace de le faire, mais ce qui est? sed? awk? comm? SQL? Comment pourrais-je accomplir cela de la manière la plus efficace possible?

+0

Dans votre csv, enlevez-vous des éléments d'une rangée? ou est comparé rangée par rangée? – aus

+0

Dépend exactement de la façon dont vous définissez "soustraire" pour les listes. Traiter les listes comme des ensembles? Ou les listes peuvent-elles contenir des doublons et l'ordre est-il pertinent? –

Répondre

4

C'est l'un des moyens les plus efficaces à mon humble avis, vous devez ajouter -F si:

grep -Fvf List_1.csv List_2.csv > Magic_List.csv 
+0

Pourquoi cela vous ferait gagner du temps? (Je ne discute pas avec vous, je suis curieux. :)) – ralphthemagician

+0

Parce qu'il ne recherche pas les expressions régulières, mais seulement pour les chaînes fixes, il s'appelle aussi grep rapide ... –

+0

Je vais donner ça un essai. Quel type d'augmentation de vitesse puis-je espérer? Une idée? – ralphthemagician

1

La façon la plus efficace est d'utiliser une structure de données arborescente ou une fonction de hachage pour la liste 2 et pour chaque article de la première recherche de liste dans votre trie.

+0

Je ne suis pas à 100% avec vous ici. Comment pourrais-je faire ça? – ralphthemagician

+0

Une trie est une structure de données puissante. En général, il est possible de construire tout le calcul sur seulement quelques règles et une structure de données hiérarchique et également la soustraction. – Bytemain

0

Vous devrez le référencer pour trouver la méthode la plus efficace. Ceci est, cependant, ce que comm est pour, donc je suppose que ce serait un joli outil.

comm -13 List_1.csv List_2.csv > Magic_List.csv 
+1

Il est à noter cependant que comm fonctionne sur une entrée triée: 'comm - compare deux fichiers triés ligne par ligne'. –

+0

Ah, vrai, bon point, et un que j'oublie souvent. –

Questions connexes