Aqui está uma maneira:
$ awk -F, -vOFS=, 'NR==FNR{a[$1]=a[$1]","$2; next}
($1 in a){print a[$1],$0}' file1 file2 |
sed 's/^,\(.*\),$//'
1,2,3,7997,52
1,2,5114,12
Explicação
-
-F, -vOFS=,
: define o separador do campo de entrada (-F
) e o separador do campo de saída (-vOFS
, essa é a cadeia inserida entre cada valor impresso quando você executaprint $1,$2
) como vírgula . -
NR==FNR{a[$1]=a[$1]","$2; next}
:FNR
é o número da linha do arquivo atual eNR
é o número da linha da entrada. Quandoawk
recebe dois arquivos para ler, essas variáveis serão iguais apenas durante a leitura do primeiro arquivo. Portanto, o primeiro bloco,NR==FNR{}
, só será executado enquanto o primeiro arquivo estiver sendo lido.O código neste bloco criará o array
a
com o primeiro campo como um índice. Cada vez que o bloco é executado, ele anexa uma vírgula e o valor do segundo campo ao que estiver armazenado na matriz no índice de$1
. Onext
pula para a próxima linha de entrada sem continuar o script, assim o segundo bloco não será executado para o primeiro arquivo.Desde a primeira vez que ele será executado,
a[$1]
estará vazio, isso adicionará uma vírgula extra ao início da matriz. Nós removemos isso com osed
no final. -
($1 in a){print a[$1],$0}
: agora estamos no segundo arquivo. Se o primeiro campo dessa linha for um índice na matriza
, imprima o valor associado a esse índice ema
e a linha atual ($0
). -
sed 's/^,\(.*\),$//'
: corresponde à primeira vírgula da linha (^,
) e, em seguida, usa parênteses para capturar tudo, exceto a última vírgula (\(.*\),$
). A coisa toda é então substituída pelo padrão capturado (). O resultado é que simplesmente remove a primeira e a última vírgula de cada linha. Isso é necessário para remover a vírgula extra adicionada no início da linha pelo script
awk
e a vírgula extra incluída no final de cada linha emfile2
. Estou removendo o último, já que você também não o mostra na saída desejada.