Réponses:
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.
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
syntaxe fonctionne (car cela ressemble à rediriger deux fois l'entrée standard!), Essayez echo hello <(cmd1) <(cmd2)
. Vous verrez quelque chose comme ça hello /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 de rdiff
et bsdiff
est plutôt binaire. L'installation bdiff
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 aucune diff
avec une option comme celle-ci, mais comm
suppose une entrée triée et sera beaucoup plus rapide si elle en fait assez pour vos besoins.
comm
travaillé très bien pour cela, jamais entendu parler auparavant, mais apparemment c'est in coreutils.
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.