Hay dos archivos llamados "a.txt" y "b.txt", ambos tienen una lista de palabras. Ahora quiero comprobar qué palabras son adicionales en "a.txt" y no en "b.txt" .
Necesito un algoritmo eficiente ya que necesito comparar dos diccionarios.
linux
terminal
diff
file-comparison
Ali Imran
fuente
fuente

diff a.txt b.txt¿no es suficiente?Respuestas:
si tienes vim instalado, prueba esto:
o
Lo encontrarás fantástico.
fuente
Clasifícalos y usa
comm:commcompara archivos de entrada (ordenados) y, de forma predeterminada, genera tres columnas: líneas que son exclusivas de a, líneas que son exclusivas de b y líneas que están presentes en ambas. Al especificar-1,-2y / o-3puede suprimir la salida correspondiente. Por lo tantocomm -23 a b, solo enumera las entradas que son exclusivas de a. Utilizo la<(...)sintaxis para ordenar los archivos sobre la marcha, si ya están ordenados, no necesita esto.fuente
commes más eficiente porque hace el trabajo en una sola ejecución, sin almacenar todo el archivo en la memoria. Como está utilizando diccionarios que probablemente ya están ordenados, ni siquiera los necesitasort. El uso,grep -f file1 file2por otro lado, cargará todofile1en la memoria y comparará cada líneafile2con todas esas entradas, lo cual es mucho menos eficiente. Es sobre todo útil para pequeños, sin clasificar-f file1.\ntambién se incluirá para hacer la comparación.Probar
sdiff(man sdiff)fuente
Puede usar la
diffherramienta en Linux para comparar dos archivos. Puede usar las opciones --changed-group-format y --unchanged-group-format-format para filtrar los datos requeridos.Las siguientes tres opciones pueden usarse para seleccionar el grupo relevante para cada opción:
'% <' obtiene líneas de FILE1
'%>' obtiene líneas de FILE2
'' (cadena vacía) para eliminar líneas de ambos archivos.
fuente
Si prefiere el estilo de salida diff
git diff, puede usarlo con el--no-indexindicador para comparar archivos que no están en un repositorio git:Utilizando un par de archivos con alrededor de 200k cadenas de nombre de archivo en cada uno, comparé (con el
timecomando incorporado ) este enfoque frente a algunas de las otras respuestas aquí:commparece ser el más rápido con diferencia, mientras quegit diff --no-indexparece ser el enfoque más rápido para la salida de estilo diff.Actualización 2018-03-25 En realidad, puede omitir el
--no-indexindicador a menos que esté dentro de un repositorio git y desee comparar archivos no rastreados dentro de ese repositorio. De las páginas del manual :fuente
También puede usar: colordiff : muestra la salida de diff con colores.
Acerca de vimdiff : le permite comparar archivos a través de SSH, por ejemplo:
Extraído de: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
fuente
Además, no se olvide de mcdiff : visor de diferencias internas de GNU Midnight Commander .
Por ejemplo:
¡Disfrutar!
fuente
Uso
comm -13(requiere archivos ordenados) :fuente
Aquí está mi solución para esto:
fuente
sdiff -s file1 file2fue útil.Usando awk para ello. Archivos de prueba:
El awk:
Se duplican los duplicados:
Para evitar duplicados, agregue cada palabra recién encontrada en a.txt a
seenhash:Salida:
Si las listas de palabras están separadas por comas, como:
tienes que hacer un par de vueltas adicionales (
forbucles):Salida esta vez:
fuente