Como obter a diferença entre arquivos

Como obter a diferença entre arquivos

Encontrei outros links nas comunidades stackoverflow que eram semelhantes, mas não responderam exatamente à minha pergunta.

Eu tenho 2 arquivos com um número diferente de linhas, mas ambos estão classificados. Meus arquivos originais têm centenas de linhas, mas para fins de solução de problemas, fiz com que o arquivo1 tivesse 12 linhas e o arquivo2 tivesse 5 linhas. Arquivo2 é um subconjunto do arquivo1. O que eu quero fazer é executar um comando que produza todas as linhas que estão no arquivo1, mas não estão no arquivo2.

Tentei usar os comandos Unix diff, commmas ambos listam o conteúdo completo do arquivo1, o que não é o que eu quero.

Um exemplo rápido disso seria:

File1      File2
A           B
B           E
C           I
E           N
G           O
I
L
M
N
O
X

Então aqui podemos ver que tudo que está no arquivo2 está no arquivo1. Por algum motivo, diffambos commmostraram o conteúdo completo do arquivo1. Presumo que seja porque ele está fazendo uma comparação linha por linha e não pesquisando o arquivo inteiro.

Existe outro comando Unix que eu possa executar que produzirá o que estou esperando?

EDIT: Os comandos que usei para tentar obter o que precisava foram:

a) diferença arquivo1 arquivo2

Basicamente, isso listou tudo do arquivo1 com um < na frente, mostrando que o conteúdo era do arquivo1, e tudo do arquivo2 com um > na frente dele. Definitivamente não é o que eu precisava

b) comunicação -23 arquivo1 arquivo2

Isso mostrou todo o conteúdo do arquivo1 novamente e não a diferença como eu esperava. eu também

c) comunicação -3 arquivo1 arquivo2

A página de ajuda do comm dizia que isso imprimiria linhas no arquivo 1, mas não no arquivo 2 e vice-versa, mas também não mostrou o que eu queria porque no meu exemplo, B aparece em ambos os arquivos, mas em linhas diferentes. No entanto, a saída pensa que está em um, mas não no outro e, portanto, imprime. Então a saída ficou assim:

A
B
    B
C
E
    E
etc.

E não era o que eu esperava. eu estava esperando

A
C
G
L
M
X

Responder1

você pode simplesmente reverter o conteúdo do arquivo b no arquivo A para fazer isso

exemplo :

francois@zaphod:/tmp$
 cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
 cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
  grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$

aqui a saída é apenas a linha do arquivo A não existente no arquivo b

Responder2

A saída Diff mostra o que deve ser feito para que o arquivo X se torne o arquivo Y.

De acordo com o seu comentário, você pode usar o seguinte oneliner:

cat x y | sort -u  | cat y - | sort | uniq -u

Ele vai

  1. Leia os dois arquivos
  2. Resolva-os e imprima apenas linhas exclusivas ( -uem classificação)
  3. Leia o arquivo (y) e combine-o com a saída canalizada
  4. Saída do resort
  5. Use uniq para que apenas linhas apresentadas uma vez ( -uem exclusivo) sejam usadas.

Este método é baseado na teoria dos conjuntos. Primeiro você adiciona dois conjuntos e depois subtrai um deles.

Responder3

Se um dos arquivos for um arquivo de texto formatado em DOS enquanto o outro arquivo for um arquivo de texto formatado em Unix, cada linha será diferente de todas as linhas do outro arquivo, mesmo que as letras nas linhas sejam iguais. Isso se deve ao caractere adicional de retorno de carro presente no final de cada linha de um arquivo, que não está presente no outro arquivo.

Eu esperaria a seguinte saída de comm -3 file1 file2quando file1é um arquivo de texto Unix enquanto file2é um arquivo de texto DOS (isto é o que você tem):

A
B
        B
C
E
        E
G
I
        I
L
M
N
        N
O
        O
X

Eu esperaria a seguinte saída de comm -3 file1 file2quando file1é um arquivo de texto DOS enquanto file2é um arquivo de texto Unix:

A
        B
B
C
        E
E
G
        I
I
L
M
        N
N
        O
O
X

Se ambos os arquivos tiverem os mesmos finais de linha, ou seja, ambos forem arquivos de texto DOS ou ambos arquivos de texto Unix, eu esperaria que a saída comm -3 file1 file2fosse

A
C
G
L
M
X

Você pode converter ambos os arquivos para o formato de texto Unix com o comando

dos2unix file1 file2

... desde que você tenha o dos2unixutilitário instalado.

informação relacionada