Como posso usar diff ou qualquer outro comando para comparar dois arquivos de texto

0

Eu tenho dois arquivos grandes (2gig cada) listados e classificados aleatoriamente, e eu preciso encontrar a diferença entre eles e gravar em um arquivo de saída:

arquivo-1:

abc1234
def4321
ghi1234

arquivo-2:

ghi1234
jk16754
abc1234
mnop3847

saída:

def4321
jk16754
mnop3847
    
por Riz 31.08.2017 / 14:34

3 respostas

2

$ join -v 1 -v 2 <( sort file-1 ) <( sort file-2 )
def4321
jk16754
mnop3847

join realiza uma operação JOIN relacional em seus arquivos de entrada classificados (usando a primeira coluna delimitada por tabulação em cada arquivo, mas isso pode ser alterado na linha de comando, consulte o manual). Ele exibe os dados correspondentes por padrão, mas com -v 1 e -v 2 , podemos obter as linhas de cada arquivo que não correspondem no outro arquivo.

Se o seu shell não suportar a substituição de processo com <(...) , então ordene os arquivos antecipadamente. Você pode querer fazer isso de qualquer maneira se planeja executar o comando várias vezes ou fazer outro trabalho nos arquivos.

$ sort -o file-1.sorted file-1
$ sort -o file-2.sorted file-2
$ join -v 1 -v 2 file-[12].sorted
    
por 31.08.2017 / 14:56
0

Uma combinação de comm e sed pode fazer o que você está procurando.

comm se compara a arquivos e gera 3 colunas. A coluna 1 é todas as linhas apenas no arquivo1, a coluna 2 é todas as linhas apenas no arquivo2 e a coluna 3 é linhas comuns.

No seu caso, você deseja suprimir a impressão da coluna 3 e, em seguida, usar sed para remover o espaço em branco das entradas da coluna 2.

bash-[533]$ comm -3 <(sort file-1) <(sort file-2) | sed -e 's/^\s*//'
def4321
jk16754
mnop3847

comm exige que os arquivos sejam classificados, e o exemplo acima mostra os arquivos sendo ordenados dinamicamente, com a saída enviada para um descritor de arquivo, mas você pode ordenar os arquivos que podem ser mais fáceis em seu arquivo. recursos do sistema e execute o comando como:

bash-[533]$ comm -3 file-1-sorted file-2-sorted | sed -e 's/^\s*//'
def4321
jk16754
mnop3847
    
por 31.08.2017 / 14:50
0

Com o comando diff :

diff --changed-group-format="%>%<" --unchanged-group-format="" <(sort file1) <(sort file2)

A saída:

def4321
jk16754
mnop3847
    
por 31.08.2017 / 15:03

Tags