¿Cómo comparo dos archivos con un script de shell?

10

Dados dos archivos, quiero escribir un script de shell que lea cada línea del archivo1 y compruebe si está allí en el archivo2. Si no se encuentra una línea, debería generar dos archivos diferentes y salir. Los archivos pueden contener palabras, números o cualquier cosa. Por ejemplo :

archivo1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

En este caso, dos archivos deberían ser iguales. si file2 tiene "hola !!!" en lugar de "hola", entonces los archivos son diferentes. Estoy usando el script bash. Cómo puedo hacer esto. No es importante que deba hacerlo en un bucle anidado, pero eso es lo que pensé que es la única forma. Gracias por tu ayuda.

0x0
fuente

Respuestas:

9

En bash:

diff --brief <(sort file1) <(sort file2)
Ignacio Vazquez-Abrams
fuente
¿Qué pasa si el archivo es un archivo csv? ¿funcionaría la clasificación?
0x0
sortno le importan los contenidos exactos a menos que se lo indique.
Ignacio Vazquez-Abrams
¿Es posible encontrar qué líneas difieren?
0x0
Eliminar --briefy agregar opciones de formato, por ejemplo -u.
Ignacio Vazquez-Abrams
10

diffestablece su estado de salida para indicar si los archivos son iguales o no. Se puede acceder al estado de salida en la variable especial $?. Puede ampliar la respuesta de Ignacio de esta manera:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi
Doug Harris
fuente
3
Puedes if diff ... >/dev/nullprescindir de los corchetes y la variable.
Pausado hasta nuevo aviso.
1

Agregando esto porque creo que [[]] && || la construcción es bastante ordenada:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")
mmrtnt
fuente
1

También debería funcionar:

comm -3 file1 file2

Creo que esto es suficiente personajes para una respuesta ...

mpez0
fuente
1

Si bien diffes una respuesta perfectamente buena, probablemente usaría cmpen su lugar, que es específicamente para hacer una comparación byte por byte de dos archivos.

https://linux.die.net/man/1/cmp

Debido a esto, tiene la ventaja adicional de poder comparar archivos binarios.

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

Me hacen creer que es más rápido que usarlo, diffaunque no lo he probado personalmente.

Ricardo
fuente
¿No iría primero el caso "los archivos son diferentes"? La prueba if pregunta si algo es cierto, es decir, un código de retorno distinto de cero. Si los archivos coinciden, cmp devuelve 0 (según la página de manual), y ese debería ser el segundo caso.
user8162
@ user8162 Lo que dices tiene sentido, sin embargo, lo acabo de probar y esa es la forma correcta. No estoy seguro de por qué ese es el caso para ser honesto.
Richard