Compare dois arquivos simples A e B, para ver se todos os registros em B também existem em A

3

Eu tenho dois arquivos simples A & B. A é um arquivo grande com milhões de registros e B deve ser um subconjunto de A. A tem 20 colunas com uma única chave & B está tendo 5 colunas com a mesma chave exclusiva. Você poderia, por favor, me informar como comparar B com A e descobrir se os registros presentes no arquivo B também estão presentes no Arquivo A e possuem os mesmos dados nas respectivas colunas.

    
por Munendra Sikarwar 26.10.2016 / 12:06

3 respostas

3

Eu criei dois arquivos para demonstrar meus comandos

file1 :

1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5

file2 :

2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5

A primeira coluna é a chave exclusiva. As colunas comuns são a coluna b , c e e . As linhas comuns são 2 , 4 e 5 . A linha 4 tem um valor diferente na coluna e .

Aqui está o comando com saída:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx

Se os arquivos já não estiverem classificados, você poderá fazer assim:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)

Explicação:

cut -d' ' -f1,3,4,6 file1

Imprima os campos 1, 3, 4 e 6 do arquivo. Campos são separados por espaço. Se os campos forem separados por vírgulas, use cut da seguinte forma: cut -d','

<( ... )

Substituição de processos

comm -1 -3 file1 file2

Imprimir linhas exclusivas para o arquivo2.

Advertências:

cut terá problemas se o caractere separador puder ocorrer como um caractere em um campo.

Por exemplo:

"field1","field2,stillfield2","field3"

cut não entenderá que a vírgula em "field2,stillfield2" faz parte do campo.

Se os seus arquivos são assim, então talvez seja melhor usar uma linguagem de programação com manipulação csv embutida. Por exemplo, python .

    
por 26.10.2016 / 14:15
0

Se os arquivos tiverem colunas diferentes, como você diz, a maneira mais fácil pode ser escrever um programa pequeno usando um idioma de sua escolha. diff e comm não serão de muita ajuda se a estrutura da linha nos arquivos não for idêntica.

    
por 26.10.2016 / 12:46
0

Além da solução comm e diff , você pode usar grep para isso.
Supondo que seus dados relevantes são colunas 1,3 e 10 no arquivo A e 1,2 e 3 no arquivo B. Usamos cut para selecionar as colunas de A, usar isso como o arquivo de correspondência de palavra-chave e reverter a presença delas no arquivo B. Se o arquivo B tiver uma linha não presente nas linhas correspondentes extraídas do arquivo A, elas serão exibidas. Se todos corresponderem, não há saída (já que B supostamente é um subconjunto de A)

grep -wvf <( cut -f1,3,10 fileA ) fileB

Ou se o arquivo B tiver mais que as três colunas:

grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )
    
por 26.10.2016 / 14:36