Difundir dos grandes archivos de texto

32

Tengo dos archivos grandes (6 GB cada uno). No están clasificados, con avances de línea ( \n) como separadores. ¿Cómo puedo diferenciarlos? Debería tomar menos de 24h.

jonasl
fuente

Respuestas:

45

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.

Richm
fuente
2
+1. Puede omitir todos los archivos temporales con canalizaciones con nombre. Use mkfifopara crear [ab].file.sortedantes de usarlos como salida para sort. Ponga ambos sorts &en el fondo y use los dos canales como nombres de archivo para diff.
krissi
15
@krissi También puede lograr el mismo efecto con esta sintaxis:diff <(command 1) <(command 2)
Michael Mrozek
Gracias trabajado. Necesitaba un par de GB de memoria, pero una instancia de Amazon EC2 de 16 GB lo solucionó :)
jonasl
77
Si alguien como yo se pregunta por qué <(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/62que de repente deja en claro;)
alex
3
En mi experiencia, la --speed-large-filesopció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 rdiffy bsdiffes bastante binario. La instalación bdiffdesde 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?
Christian Pietsch
5

Ordenar las entradas y decirle al diffprograma que sus entradas están ordenadas proporcionaría una velocidad masiva. No conozco ninguno diffcon una opción como esa, pero commsupone una entrada ordenada y será mucho más rápido si hace lo suficiente para sus propósitos.

Karl
fuente
commfuncionó muy bien para esto, nunca antes había oído hablar de él pero aparentemente está en coreutils
theferrit32