Como comparo dois arquivos com um script de shell?

10

Dados dois arquivos, quero escrever um script de shell que leia cada linha do arquivo1 e verifique se existe no arquivo2. Se uma linha não for encontrada, ela deverá gerar dois arquivos diferentes e sair. Os arquivos podem conter números de palavras ou qualquer coisa. Por exemplo :

file1:

Hi!
1234
5678
1111
hello

arquivo2:

1111
5678
1234
Hi!
hello

Nesse caso, dois arquivos devem ser iguais. se o arquivo2 tiver "olá !!!" em vez de "olá", os arquivos são diferentes. Estou usando o script bash. Como posso fazer isso. Não é importante que eu precise fazer isso em um loop aninhado, mas foi o que pensei ser o único caminho. Obrigado pela ajuda.

0x0
fonte

Respostas:

9

Na festança:

diff --brief <(sort file1) <(sort file2)
Ignacio Vazquez-Abrams
fonte
E se o arquivo for um arquivo CSV. a classificação ainda funcionaria?
0x0
sortnão se importa com o conteúdo exato, a menos que você o solicite.
Ignacio Vazquez-Abrams
É possível encontrar quais linhas diferem?
0x0
Remova --briefe adicione opções de formato, por exemplo -u.
Ignacio Vazquez-Abrams
10

diffdefine seu status de saída para indicar se os arquivos são iguais ou não. O status de saída está acessível na variável especial $?. Você pode expandir a resposta de Ignacio desta maneira:

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
fonte
3
Você pode simplesmente ficar if diff ... >/dev/nullsem os colchetes e a variável.
Pausado até novo aviso.
1

Adicionando isso porque acho que os [[]] && || A construção é bem legal:

#!/bin/bash

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

Também deve funcionar:

comm -3 file1 file2

Eu acho que isso é caracteres suficientes para uma resposta ...

mpez0
fonte
1

Embora diffseja uma resposta perfeitamente correta, eu provavelmente usaria, em cmpvez disso, especificamente para fazer uma comparação de byte a byte de dois arquivos.

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

Por esse motivo, possui o bônus adicional de poder comparar arquivos binários.

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

Sou levado a acreditar que é mais rápido do que usar, diffembora não tenha testado isso pessoalmente.

Richard
fonte
O caso "os arquivos são diferentes" não seria o primeiro? O teste if pergunta se algo é verdadeiro, ou seja, um código de retorno diferente de zero. Se os arquivos corresponderem, cmp retornará 0 (por página de manual) e, portanto, esse será o segundo caso.
user8162
@ user8162 O que você diz faz sentido, no entanto, acabei de testá-lo e esse é o caminho certo. Não sei por que esse é o caso, para ser honesto.
Richard