J'ai deux gros fichiers (6 Go chacun). Ils ne sont pas triés, avec des sauts de ligne ( \n
) comme séparateurs. Comment puis-je les différencier? Cela devrait prendre moins de 24h.
la source
J'ai deux gros fichiers (6 Go chacun). Ils ne sont pas triés, avec des sauts de ligne ( \n
) comme séparateurs. Comment puis-je les différencier? Cela devrait prendre moins de 24h.
La réponse la plus évidente consiste simplement à utiliser la commande diff et c'est probablement une bonne idée d'y ajouter le paramètre --speed-large-files.
diff --speed-large-files a.file b.file
Vous mentionnez des fichiers non triés, vous devrez peut-être d'abord trier les fichiers
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
vous pouvez enregistrer la création d'un fichier de sortie supplémentaire en canalisant la sortie du deuxième tri directement dans diff
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Évidemment, ceux-ci fonctionneront mieux sur un système avec beaucoup de mémoire disponible et vous aurez probablement besoin de beaucoup d'espace disque libre aussi.
Votre question ne vous a pas permis de savoir si vous les avez déjà essayées auparavant. Si c'est le cas, il serait utile de savoir ce qui n'a pas fonctionné (a pris trop de temps, etc.). J'ai toujours constaté que les commandes stock sort et diff ont tendance à faire au moins aussi bien que les commandes personnalisées, sauf s'il existe des propriétés très spécifiques au domaine des fichiers qui permettent de faire les choses différemment.
mkfifo
pour créer[ab].file.sorted
avant de les utiliser comme sortie poursort
. Mettez les deuxsort
s&
en arrière-plan et utilisez les deux piped comme noms de fichiers pour diff.diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
syntaxe fonctionne (car cela ressemble à rediriger deux fois l'entrée standard!), Essayezecho hello <(cmd1) <(cmd2)
. Vous verrez quelque chose comme çahello /dev/fd/63 /dev/fd/62
qui le rend tout à coup clair;)--speed-large-files
option n'aide pas si vous n'avez pas assez de RAM. De plus, le pré-tri n'est pas utile si vous souhaitez conserver une structure d'enregistrement sur plusieurs lignes. Les options mentionnées ci-dessus (par @unhammer) sont intéressantes, mais la sortie derdiff
etbsdiff
est plutôt binaire. L'installationbdiff
depuis Heirloom Toolbox ressemble à une tâche ardue (nécessite des devtools Heirloom, des fichiers d'en-tête éteints,…). Vaut-il vraiment la peine? Existe-t-il d'autres alternatives?Trier les entrées et dire au
diff
programme que ses entrées sont triées fournirait une accélération massive. Je n'en connais aucunediff
avec une option comme celle-ci, maiscomm
suppose une entrée triée et sera beaucoup plus rapide si elle en fait assez pour vos besoins.la source
comm
travaillé très bien pour cela, jamais entendu parler auparavant, mais apparemment c'est in coreutils.