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


Dado 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 números de palabras o cualquier cosa. Por ejemplo :

archivo1:

Hi!
1234
5678
1111
hello

archivo2:

1111
5678
1234
Hi!
hello

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


9


origen




Respuestas:


En bash:

diff --brief <(sort file1) <(sort file2)

9



¿Qué sucede si el archivo es un archivo csv? ordenaría todavía funciona? - aruva arumugam
sort no le importa el contenido exacto a menos que se lo indique. - Ignacio Vazquez-Abrams
¿Es posible encontrar qué líneas difieren? - aruva arumugam
retirar --brief y agregue opciones de formato, p. -u. - Ignacio Vazquez-Abrams


diff establece su estado de salida para indicar si los archivos son iguales o no. El estado de salida es accesible 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

8



Esto fue útil. Gracias - aruva arumugam
Puedes simplemente hacer if diff ... >/dev/null sin los corchetes y variable. - Dennis Williamson


Agregando esto porque creo que el [[]] && || construir es bastante limpio:

#!/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 caracteres para una respuesta ...


1





Mientras que diff es una respuesta perfecta, probablemente use cmp en su lugar, que es específicamente para hacer una comparación byte a 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 usar diff aunque no he probado personalmente eso.


0