Respuestas:
La respuesta más obvia es usar el comando diff y probablemente sea una buena idea agregarle el parámetro --speed-large-files.
diff --speed-large-files a.file b.file
Menciona archivos sin clasificar, por lo que tal vez necesite ordenarlos primero
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
podría guardar la creación de un archivo de salida adicional canalizando la salida de la segunda clase directamente en diff
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Obviamente, estos funcionarán mejor en un sistema con mucha memoria disponible y es probable que también necesite mucho espacio libre en el disco.
No quedó claro a partir de su pregunta si ha probado esto antes. Si es así, sería útil saber qué salió mal (tardó demasiado, etc.). Siempre he descubierto que los comandos stock sort y diff tienden a funcionar al menos tan bien como los comandos personalizados, a menos que haya algunas propiedades específicas de dominio de los archivos que permitan hacer las cosas de manera diferente.
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
funciona la sintaxis (¡ya que suena como redireccionar la entrada estándar dos veces!), Intente echo hello <(cmd1) <(cmd2)
. Verás algo como lo hello /dev/fd/63 /dev/fd/62
que de repente deja en claro;)
--speed-large-files
opción no ayuda si no tienes suficiente RAM. Además, la clasificación previa no es útil si tiene una estructura de registro de varias líneas que desea conservar. Las opciones mencionadas anteriormente (por @unhammer) son interesantes, pero el resultado de rdiff
y bsdiff
es bastante binario. La instalación bdiff
desde Heirloom Toolbox parece una tarea difícil (requiere herramientas de desarrollo de Heirloom, archivos de encabezado extintos, ...). ¿Realmente vale la pena el esfuerzo? ¿Hay otras alternativas?
Ordenar las entradas y decirle al diff
programa que sus entradas están ordenadas proporcionaría una velocidad masiva. No conozco ninguno diff
con una opción como esa, pero comm
supone una entrada ordenada y será mucho más rápido si hace lo suficiente para sus propósitos.
comm
funcionó muy bien para esto, nunca antes había oído hablar de él pero aparentemente está en coreutils
mkfifo
para crear[ab].file.sorted
antes de usarlos como salida parasort
. Ponga ambossort
s&
en el fondo y use los dos canales como nombres de archivo para diff.