Como comparar dois arquivos

55

Então, basicamente, o que eu quero fazer é comparar dois arquivos por linha, por coluna, 2. Como eu poderia conseguir isso?

Arquivo_1.txt:

User1 US
User2 US
User3 US

Arquivo_2.txt:

User1 US
User2 US
User3 NG

Output_File:

User3 has changed
    
por Roboman1723 25.08.2014 / 16:58

9 respostas

64

Procure no comando diff . É uma boa ferramenta, e você pode ler tudo sobre isso digitando man diff no seu terminal.

O comando que você vai querer fazer é diff File_1.txt File_2.txt , que irá mostrar a diferença entre os dois e deve ser algo como isto:

Uma nota rápida sobre a leitura da saída do terceiro comando: As 'setas' ( < e > ) referem-se ao valor da linha no arquivo à esquerda ( < ) versus o arquivo correto ( > ), com o arquivo da esquerda sendo o primeiro digitado na linha de comando, neste caso File_1.txt

Além disso, você pode notar que o quarto comando é diff ... | tee Output_File , canaliza os resultados de diff para tee , que então coloca essa saída em um arquivo, para que você possa salvá-lo mais tarde, se não o fizer quero ver tudo no console certo naquele segundo.

    
por Mitch 25.08.2014 / 17:03
31

Ou você pode usar Meld Diff

  

O Meld ajuda a comparar arquivos, diretórios e versões controlados   projetos. Ele fornece comparação de dois e três caminhos de arquivos e   diretórios e tem suporte para muitos sistemas de controle de versão populares.

Instale executando:

sudo apt-get install meld

Seu exemplo:

Compare o diretório:

Exemplo com texto completo:

    
por Achu 25.08.2014 / 17:57
9

Você pode usar o vimdiff .

Exemplo:

vimdiff  file1  file2
    
por Mr. S 28.08.2014 / 07:14
7

Meld é uma ótima ferramenta. Mas você também pode usar diffuse para comparar visualmente dois arquivos:

diffuse file1.txt file2.txt

    
por Meysam 26.08.2014 / 08:54
7

Litteraly aderindo à pergunta (file1, file2, outputfile com a mensagem "has changed") o script abaixo funciona.

Copie o script em um arquivo vazio, salve-o como compare.py , torne-o executável, execute-o pelo comando:

/path/to/compare.py <file1> <file2> <outputfile>

O script:

#!/usr/bin/env python

import sys
file1 = sys.argv[1]; file2 = sys.argv[2]; outfile = sys.argv[3]

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

with open(outfile, "wt") as out:
    for line in mismatch:
        out.write(line+" has changed"+"\n")

Com algumas linhas extras, você pode imprimir em um arquivo de saída ou no terminal, dependendo se o arquivo de saída está definido:

Para imprimir em um arquivo:

/path/to/compare.py <file1> <file2> <outputfile>

Para imprimir na janela do terminal:

/path/to/compare.py <file1> <file2> 

O script:

#!/usr/bin/env python

import sys

file1 = sys.argv[1]; file2 = sys.argv[2]
try:
    outfile = sys.argv[3]
except IndexError:
    outfile = None

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

if outfile != None:
        with open(outfile, "wt") as out:
            for line in mismatch:
                out.write(line+" has changed"+"\n")
else:
    for line in mismatch:
        print line+" has changed"
    
por Jacob Vlijm 25.08.2014 / 20:34
7

Você pode usar o comando cmp :

cmp -b "File_1.txt" "File_2.txt"

saída seria

a b differ: byte 25, line 3 is 125 U 116 N
    
por Maythux 17.06.2015 / 12:58
6

FWIW, gosto bastante do que recebo com a saída lado-a-lado do diff

diff -y -W 120 File_1.txt File_2.txt

daria algo como:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG
    
por Mike Reardon 22.05.2015 / 21:37
3

Resposta adicional

Se não houver necessidade de saber quais partes dos arquivos são diferentes, você pode usar a soma de verificação do arquivo. Há muitas maneiras de fazer isso usando md5sum ou sha256sum . Basicamente, cada um deles gera uma string na qual um hash do conteúdo do arquivo. Se os dois arquivos forem iguais, o hash deles será o mesmo. Isso costuma ser usado quando você faz o download de software, como imagens iso de instalação do Ubuntu. Eles costumam ser usados para verificar a integridade de um conteúdo baixado.

Considere o script abaixo, em que você pode fornecer dois arquivos como argumentos e o arquivo informará se eles são iguais ou não.

#!/bin/bash

# Check if both files exist  
if ! [ -e ""  ];
then
    printf "%s doesn't exist\n" ""
    exit 2
elif ! [ -e "" ]
then
    printf "%s doesn't exist\n" ""
    exit 2
fi

# Get checksums of eithe file
file1_sha=$( sha256sum "" | awk '{print }')
file2_sha=$( sha256sum "" | awk '{print }')

# Compare the checksums
if [ "x$file1_sha" = "x$file2_sha" ]
then
    printf "Files %s and %s are the same\n" "" ""
    exit 0
else
    printf "Files %s and %s are different\n" "" ""
    exit 1
fi

Execução da amostra:

$ ./compare_files.sh /etc/passwd ./passwd_copy.txt                                                                
Files /etc/passwd and ./passwd_copy.txt are the same
$ echo $?
0
$ ./compare_files.sh /etc/passwd /etc/default/grub                                                                
Files /etc/passwd and /etc/default/grub are different
$ echo $?
1

Resposta mais antiga

Além disso, há o comando comm , que compara dois arquivos classificados e fornece a saída em 3 colunas: coluna 1 para itens exclusivos do arquivo 1, coluna 2 dos itens exclusivos do arquivo 2 e coluna 3 dos itens presente em ambos os arquivos.

Para suprimir qualquer coluna, você pode usar os comutadores -1, -2 e -3. Usar -3 mostrará as linhas que diferem.

Abaixo, você pode ver a captura de tela do comando em ação.

Existe apenas um requisito - os arquivos devem ser classificados para serem comparados adequadamente. O comando sort pode ser usado para essa finalidade. Abaixo está outra captura de tela, onde os arquivos são classificados e comparados. Linhas iniciando na esquerda para somente o arquivo_1, linhas iniciando na coluna 2 pertencem somente ao arquivo_2

    
por Sergiy Kolodyazhnyy 22.05.2015 / 21:51
3

Uma maneira fácil é usar colordiff , que se comporta como diff , mas coloriza sua saída. Isso é muito útil para ler os diffs. Usando seu exemplo,

$ colordiff -u File_1.txt File_2.txt
--- File_1.txt  2016-12-24 17:59:17.409490554 -0500
+++ File_2.txt  2016-12-24 18:00:06.666719659 -0500
@@ -1,3 +1,3 @@
 User1 US
 User2 US
-User3 US
+User3 NG

em que a opção u fornece um diff unificado. É assim que o diff colorido se parece:

Instale colordiff executando sudo apt-get install colordiff .

    
por edwinksl 25.12.2016 / 00:05

Tags