Cómo obtener la diferencia entre archivos

Cómo obtener la diferencia entre archivos

Encontré otros enlaces en las comunidades de stackoverflow que eran similares pero no respondieron mi pregunta exactamente.

Tengo 2 archivos con un número diferente de líneas PERO los tengo ambos ordenados. Mis archivos originales tienen cientos de líneas, pero para solucionar problemas, hice que el archivo1 tuviera 12 líneas y el archivo2 tuviera 5 líneas. Archivo2 es un subconjunto de archivo1. Lo que quiero hacer es ejecutar un comando que genere todas las líneas que están en el archivo1 pero no en el archivo2.

Intenté usar los comandos de Unix diffy commambos enumeran el contenido completo del archivo1, que no es lo que quiero.

Un ejemplo rápido de esto sería:

File1      File2
A           B
B           E
C           I
E           N
G           O
I
L
M
N
O
X

Aquí podemos ver que todo lo que está en el archivo 2 está en el archivo 1. Por alguna razón, diffambos commmostraron el contenido completo del archivo1. Supongo que es porque está haciendo una comparación línea por línea y no buscando en todo el archivo.

¿Hay otro comando de Unix que pueda ejecutar y que genere lo que espero?

EDITAR: Los comandos que utilicé para intentar obtener lo que necesitaba fueron:

a) diferencia archivo1 archivo2

Básicamente, esto enumera todo, desde el archivo1 con un < delante, que muestra que el contenido era del archivo1, y todo, desde el archivo2, con un > delante. Definitivamente no es lo que necesitaba

b) comunicación -23 archivo1 archivo2

Esto mostró nuevamente todo el contenido del archivo 1 y no la diferencia como esperaba. Yo también

c) comunicación -3 archivo1 archivo2

La página de ayuda para comunicaciones decía que esto imprimiría líneas en el archivo 1 pero no en el archivo 2 y viceversa, pero esto tampoco mostraba lo que quería b/c en mi ejemplo, B aparece en ambos archivos pero en líneas diferentes. Sin embargo, el resultado cree que está en uno pero no en el otro y, por lo tanto, lo imprime. Entonces la salida se vio así:

A
B
    B
C
E
    E
etc.

Y no era lo que esperaba. Yo estaba esperando

A
C
G
L
M
X

Respuesta1

puedes simplemente invertir el contenido del archivo b en el archivo A para hacer eso

ejemplo :

francois@zaphod:/tmp$
 cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
 cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
  grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$

aquí la salida es solo la línea del archivo A que no existe en el archivo b

Respuesta2

La salida de diferencia muestra lo que se debe hacer para que el archivo X se convierta en el archivo Y.

Según su comentario, podría utilizar la siguiente línea:

cat x y | sort -u  | cat y - | sort | uniq -u

Va a

  1. Leer ambos archivos
  2. Recurrirlos e imprimir solo líneas únicas ( -uen orden)
  3. Lea el archivo (y) y combínelo con la salida canalizada
  4. Salida del resort
  5. Utilice uniq para que solo se utilicen las líneas que se presentan una vez ( -uen único).

Este método se basa en la teoría de conjuntos. Primero sumas dos conjuntos y luego restas uno de ellos.

Respuesta3

Si uno de los archivos es un archivo de texto con formato DOS mientras que el otro archivo es un archivo de texto con formato Unix, entonces cada línea será diferente de todas las líneas del otro archivo, incluso si las letras de las líneas son las mismas. Esto se debe al carácter de retorno de carro adicional presente al final de cada línea en un archivo, que no está presente en el otro archivo.

Esperaría el siguiente resultado de comm -3 file1 file2cuándo file1es un archivo de texto Unix y cuándo file2es un archivo de texto DOS (esto es lo que tiene):

A
B
        B
C
E
        E
G
I
        I
L
M
N
        N
O
        O
X

Esperaría el siguiente resultado de comm -3 file1 file2cuándo file1es un archivo de texto de DOS y cuándo file2es un archivo de texto de Unix:

A
        B
B
C
        E
E
G
        I
I
L
M
        N
N
        O
O
X

Si ambos archivos tienen los mismos finales de línea, es decir, ambos son archivos de texto de DOS o ambos son archivos de texto de Unix, esperaría que la salida de comm -3 file1 file2fuera

A
C
G
L
M
X

Puede convertir ambos archivos al formato de texto Unix con el comando

dos2unix file1 file2

... dado que tienes la dos2unixutilidad instalada.

información relacionada