¿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.

Respuestas:



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

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")

1

También debería funcionar:

comm -3 file1 file2

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


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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.