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.
mkfifopara crear[ab].file.sortedantes de usarlos como salida parasort. Ponga ambossorts&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/62que de repente deja en claro;)--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 derdiffybsdiffes bastante binario. La instalaciónbdiffdesde 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
diffprograma que sus entradas están ordenadas proporcionaría una velocidad masiva. No conozco ningunodiffcon una opción como esa, perocommsupone una entrada ordenada y será mucho más rápido si hace lo suficiente para sus propósitos.fuente
commfuncionó muy bien para esto, nunca antes había oído hablar de él pero aparentemente está en coreutils