Saída de linhas diferentes ao comparar dois arquivos

2

Eu tenho dois arquivos de texto com o mesmo número de strings terminadas por novas linhas. As linhas nos dois arquivos correspondem umas às outras. As linhas de cada arquivo individualmente podem ser repetidas.

Gostaria de identificar rapidamente quais duas linhas diferem e saem do primeiro arquivo ou do segundo.

Arquivo A:

this is a string
this is another string
empty string

Arquivo B:

this is A string
this is another string
Empty string

Do ponto de vista do arquivo A, eu gostaria de produzir as primeiras e terceiras linhas, pois elas são diferentes do arquivo B. Da mesma forma, no arquivo B, eu geraria as primeiras e as terceiras linhas desses arquivos.

Minha abordagem padrão para comparar arquivos foi ordenar os dois arquivos e depois usar o binário comm , mas a ordenação destruiria a correspondência entre os dois arquivos. Eu também tentei fazer isso com diff , mas parece ser projetado para uma tarefa diferente.

Também seria correto gerar as duas linhas diferentes dos dois arquivos com uma separação de separadores.

    
por Vladislavs Dovgalecs 06.04.2015 / 23:40

1 resposta

2

Isso faz a comparação da perspectiva de fileA :

$ awk 'FNR==NR{a[NR]=$0;next;} $0!=a[FNR]' fileB fileA
this is a string
empty string

Essa abordagem lê todo o fileB na memória. Assim, se seus arquivos são enormes (muito grandes para memória), você deve escolher outra abordagem.

Similarmente, para obter a saída da perspectiva de fileB :

$ awk 'FNR==NR{a[NR]=$0;next;} $0!=a[FNR]' fileA fileB
this is A string
Empty string

Mais abordagem eficiente de memória

Essa abordagem só lê em duas linhas por vez e, portanto, é mais eficiente em termos de memória. Da perspectiva de FileA :

$ awk '{a=$0;getline <"fileA";} $0!=a' fileB
this is a string
empty string

Da perspectiva de fileB :

$ awk '{a=$0;getline <"fileB";} $0!=a' fileA
this is A string
Empty string
    
por 06.04.2015 / 23:46