No bash:
diff --brief <(sort file1) <(sort file2)
Dado dois arquivos, quero escrever um script de shell que leia cada linha do arquivo1 e verifique se ele está lá no arquivo2. Se uma linha não for encontrada, deve sair dois arquivos diferentes e sair. Os arquivos podem conter números de palavras ou qualquer coisa. Por exemplo:
arquivo1:
Hi!
1234
5678
1111
hello
arquivo2:
1111
5678
1234
Hi!
hello
Nesse caso, dois arquivos devem ser iguais. se file2 tem "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 é o que eu acho que é o único caminho. Obrigado pela sua ajuda.
diff
define 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
Adicionando isso porque acho que o [[]] & & || A construção é bem legal:
#!/bin/bash
[[ 'diff ${HOME}/file1 ${HOME}/file2' ]] &&
(echo "files different") ||
(echo "files same")
Também deve funcionar:
comm -3 file1 file2
Acho que isso é suficiente caracteres para uma resposta ...
Apesar de diff
ser uma resposta perfeitamente boa, eu provavelmente usaria cmp
, que é especificamente para fazer uma comparação byte a byte de dois arquivos.
Por causa disso, ele tem a vantagem 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 diff
, embora eu não tenha testado isso pessoalmente.