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','
<( ... )
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 .