Como eu comparo dois arquivos com um script de shell?

9

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.

    
por aruva arumugam 18.01.2011 / 18:27

5 respostas

9

No bash:

diff --brief <(sort file1) <(sort file2)
    
por 18.01.2011 / 18:33
8

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
    
por 18.01.2011 / 19:33
1

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

#!/bin/bash

[[ 'diff ${HOME}/file1 ${HOME}/file2' ]] &&  
   (echo "files different") ||
   (echo "files same")
    
por 08.04.2014 / 00:32
1

Também deve funcionar:

comm -3 file1 file2

Acho que isso é suficiente caracteres para uma resposta ...

    
por 18.01.2011 / 19:08
1

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.

link

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.

    
por 26.10.2017 / 10:42