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
:comm
compara 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
,-2
y / o-3
puede 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
comm
es 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 file2
por otro lado, cargará todofile1
en la memoria y comparará cada líneafile2
con todas esas entradas, lo cual es mucho menos eficiente. Es sobre todo útil para pequeños, sin clasificar-f file1
.\n
también se incluirá para hacer la comparación.Probar
sdiff
(man sdiff
)fuente
Puede usar la
diff
herramienta 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-index
indicador 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
time
comando incorporado ) este enfoque frente a algunas de las otras respuestas aquí:comm
parece ser el más rápido con diferencia, mientras quegit diff --no-index
parece ser el enfoque más rápido para la salida de estilo diff.Actualización 2018-03-25 En realidad, puede omitir el
--no-index
indicador 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 file2
fue ú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
seen
hash:Salida:
Si las listas de palabras están separadas por comas, como:
tienes que hacer un par de vueltas adicionales (
for
bucles):Salida esta vez:
fuente