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. Quandoawkrecebe 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
acom 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. Onextpula 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 osedno 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 emae 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 scriptawke 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.