como posso comparar dados em 2 arquivos para identificar dados comuns e exclusivos? [duplicado]

4

Como posso comparar dados em dois arquivos para identificar dados comuns e exclusivos? Eu não posso fazer isso linha por linha porque eu tenho o arquivo 1, que contém 100 id / códigos / conjunto de números e quero comparar um arquivo 2 com o arquivo 1.

O problema é que o arquivo 2 contém um subconjunto de dados no arquivo 1 e também dados exclusivos do arquivo 2, por exemplo:

file 1      file 2
1            1
2            a
3            2
4            b
5            3 
6            c

Como posso comparar os dois arquivos para identificar dados comuns e exclusivos de cada arquivo? diff parece não conseguir fazer o trabalho.

    
por Vigneswara Prabhu 02.04.2015 / 11:39

3 respostas

5

Isso é o que comm é para:

$ comm <(sort file1) <(sort file2)
        1
        2
        3
4
5
6
    a
    b
    c

A primeira coluna é apenas linhas que aparecem no arquivo 1
A segunda coluna é linhas apenas aparecendo no arquivo 2 A terceira coluna é comum a ambos os arquivos

comm requer que os arquivos de entrada sejam classificados

Para excluir qualquer coluna que apareça, adicione uma opção com esse número de coluna. Por exemplo, para ver apenas as linhas em comum, use comm -12 ... ou as linhas que estão apenas no arquivo2, comm -13 ...

    
por glenn jackman 02.04.2015 / 12:30
4

Não importa se o arquivo1 e o arquivo2 estão classificados ou não, use awk comando da seguinte forma:

dados exclusivos no arquivo1:

awk 'NR==FNR{a[$0];next}!($0 in a)' file2 file1
4
5
6

dados exclusivos no arquivo2:

awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2
a
b
c

dados comuns:

awk 'NR==FNR{a[$0];next} ($0 in a)' file1 file2
1
2
3

Explicação:

NR==FNR    - Execute next block for 1st file only
a[$0]      - Create an associative array with key as '$0' (whole line) and copy that into it as its content.
next       - move to next row
($0 in a)  - For each line saved in 'a' array:
             print the common lines from 1st and 2nd file "($0 in a)' file1 file2"
             or unique lines in 1st file only "!($0 in a)' file2 file1"
             or unique lines in 2nd file only "!($0 in a)' file1 file2"
    
por devWeek 02.04.2015 / 12:44
0

xxdiff é incomparável se você precisar ver graficamente as alterações entre dois arquivos (ou diretórios!):

Como os diff e comm regulares, os arquivos de entrada devem ser classificados primeiro.

sort file1.txt > file1.txt.sorted
sort file2.txt > file2.txt.sorted
xxdiff file1.txt.sorted file2.txt.sorted
    
por whereisalext 03.04.2015 / 12:21