Isso deve ser feito:
awk -F, -vOFS=, '(NR==FNR){a[$1]=$0; next}
{
if(a[$1]){print $0,a[$1]}
else{print $0,"no match"}
}' file2.csv file1.csv
Explicação
-
awk -F, -vOFS=,
: runawk
, definindo os separadores de campo de entrada (-F
) e saída (-vOFS=,
) para,
. -
(NR==FNR){a[$1]=$0; next}
:NR
eFNR
são variáveis especiais que significam o número da linha atual e o número da linha atual do arquivo atual , respectivamente. Ao passar mais de um nome de arquivo, os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Então, isso significa "ao ler o primeiro arquivo, salve cada linha em uma matriz cuja chave é o primeiro campo e vá para a próxima linha". -
if(a[$1]){print $0,a[$1]}
: agora estamos no segundo arquivo. Se o primeiro campo da linha atual também estava no primeiro arquivo, imprima a linha atual e a linha do primeiro arquivo. -
else{print $0,"no match"}
: se o primeiro campo não estava no primeiro arquivo, imprima a linha atual e "sem correspondência"
Observe que estou passando file2.csv
como o primeiro arquivo e file1.csv
como o segundo. Isso ocorre porque um dos dois arquivos precisa ser armazenado na memória, por isso é melhor armazenar o menor dos dois.