60 votes

bash, Linux: différence entre deux fichiers texte

J'ai deux fichiers A-nodes_to_delete et B-nodes_to_keep. Chaque fichier a un nombre de lignes avec des id numériques.

Je veux avoir la liste des id numériques qui sont en nodes_to_delete mais PAS en nodes_to_keep, par exemple alt text.

Le faire au sein d'une base de données PostgreSQL est excessivement lent. De toute manière simple de le faire en bash sous Linux avec des outils CLI?

Mise à JOUR: Cela semble être une Pythonic travail, mais les fichiers sont vraiment, vraiment grand. J'ai résolu certains des problèmes similaires à l'aide de uniq, sort , et certains de la théorie des ensembles techniques. C'était à propos de deux ou trois ordres de grandeur plus rapide que la base de données équivalents.

Adam

98voto

msw Points 25319

Le comm de commande fait.

38voto

slinkp Points 1154

Quelqu'un m'a montré comment faire exactement ce poisson il y a quelques mois, et puis je ne pouvais pas le trouver pendant un certain temps... et en cherchant je suis tombé sur votre question. Ici, il est:

set_union () {
   cat $1 $2 | sort | uniq
}

set_difference () {
   cat $1 $2 $2 | sort | uniq -u
}

4voto

Alberto Zaccagni Points 11478

La première chose qui vient à l'esprit est:

diff nodes_to_delete nodes_to_keep | grep '<'

J'ai répondu avant de votre montage, donc je ne pense pas que cela pourrait encore s'appliquer si vous avez trouvé la db de manière à être lent...

1voto

Dark Castle Points 731

Vous avez peut être besoin d'une meilleure façon de le faire dans postgres, je peux à peu près à parier que vous ne trouverez pas un moyen plus rapide de le faire en utilisant des fichiers plats. Vous devriez être capable de faire une simple jointure interne et en supposant que les deux id cols sont indexés qui devrait être très rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X