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.
fuente
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.
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.
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.diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
funciona la sintaxis (¡ya que suena como redireccionar la entrada estándar dos veces!), Intenteecho hello <(cmd1) <(cmd2)
. Verás algo como lohello /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 derdiff
ybsdiff
es bastante binario. La instalaciónbdiff
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 ningunodiff
con una opción como esa, perocomm
supone una entrada ordenada y será mucho más rápido si hace lo suficiente para sus propósitos.fuente
comm
funcionó muy bien para esto, nunca antes había oído hablar de él pero aparentemente está en coreutils