O espaço está sendo alterado porque você está imprimindo i) o 1º e o 2º campo concatenados e ii) o terceiro campo. Por padrão, awk
usa um espaço como o separador do campo de saída ( OFS
), o que estraga seu espaçamento. Uma solução simples é salvar a própria linha ( $0
) na matriz, em vez dos campos:
a[$1$2]=$0;
No entanto, o seu script não faz o que você quer de qualquer maneira. Ele só imprimirá linhas do arquivo1 que estavam presentes no arquivo2, portanto, qualquer coisa que esteja apenas no arquivo1 será ignorada. De acordo com a saída desejada, você deseja imprimir todas as linhas de ambos os arquivos e, se qualquer linha do arquivo2 tiver os mesmos dois primeiros campos como um no arquivo1, imprima apenas a linha correspondente do arquivo1. Você pode fazer isso em awk
com:
awk 'FNR==NR{a[$1$2]=$0; print} !($1$2 in a) {print}' file1 file2
Isso salvará cada linha de file1
na matriz e também a imprimirá. Então, quando file2
estiver sendo processado, ele imprimirá qualquer linha cujos primeiros dois campos não estejam em a
.
Note que você também pode fazer isso usando sort
:
$ sort -uk1,2 file1 file2
11111111 abc12345 Y
22222222 xyz23456 Y
33333333 kbc34567
Você só precisa se certificar de que a quantidade de espaço em branco nos dois arquivos é a mesma (o que não é o caso do seu exemplo) ou fazer isso com:
$ sed 's/ */\t/g' file1 file2 | sort -uk1,2
11111111 abc12345 Y
22222222 xyz23456 Y
33333333 kbc34567