A resposta de Roman é boa e dá a saída exata que você pediu.
Se, no entanto, você somente precisasse dos dados brutos (ou seja, sem cabeçalhos CSV e sem a formatação bem impressa), você poderia usar paste
+ comm
+ grep
+ substituição de processos :
$ paste <(comm -1 -3 file1 file2) <(comm -2 -3 file1 file2) |
grep -f <(sed -e 's/^/^/; s/$/,/;' file3)
2,kk,44 2,kk,45
3,ss,55 3,ss,56
Explicação:
comm -1 -3 file1 file2
exibe as linhas exclusivas de file2
. comm -2 -3 file1 file2
gera as linhas exclusivas para file1
. A saída desses dois comandos é dada para paste
por meio da substituição do processo e unidos.
A saída de
paste
é então canalizada para o grep para produzir apenas as linhas que correspondem aos ids listados em file3
. A substituição de processos também é usada aqui para transformar as IDs listadas no arquivo3 em expressões regulares ancoradas que correspondem aos números de ID SOMENTE quando estão no início de uma linha e seguidas por uma vírgula.
Fazer algo assim seria útil se você quisesse / precisasse de um processamento adicional antes de imprimir bem a saída.