Como mesclar dois arquivos usando o AWK?

O arquivo 1 tem 5 campos ABCDE, com o campo A é um valor inteiro

Arquivo 2 tem 3 campos AFG

O número de linhas no Arquivo 1 é muito maior que o do Arquivo 2 (20 ^ 6 a 5000)

Todas as inputs de A no Arquivo 1 apareceram no campo A no Arquivo 2

Eu gosto de mesclar os dois arquivos pelo campo A e carrego F e G

A saída desejada é ABCDEFG

Exemplo

Arquivo 1

ABCDE 4050 S00001 31228 3286 0 4050 S00012 31227 4251 0 4049 S00001 28342 3021 1 4048 S00001 46578 4210 0 4048 S00113 31221 4250 0 4047 S00122 31225 4249 0 4046 S00344 31322 4000 1 

Arquivo 2

 AFG 4050 12.1 23.6 4049 14.4 47.8 4048 23.2 43.9 4047 45.5 21.6 

Saída desejada

 ABCDEFG 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6 

 $ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6 4046 S00344 31322 4000 1 

Felizmente, você não precisa escrever isso. O Unix tem um comando de junit para fazer isso por você.

 join -1 1 -2 1 File1 File2 

Aqui está “em ação”:

 will-hartungs-computer:tmp will$ cat f1 4050 S00001 31228 3286 0 4050 S00012 31227 4251 0 4049 S00001 28342 3021 1 4048 S00001 46578 4210 0 4048 S00113 31221 4250 0 4047 S00122 31225 4249 0 4046 S00344 31322 4000 1 will-hartungs-computer:tmp will$ cat f2 4050 12.1 23.6 4049 14.4 47.8 4048 23.2 43.9 4047 45.5 21.6 will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6 will-hartungs-computer:tmp will$ 

Você precisa ler as inputs do Arquivo 2 em um par de matrizes associativas no bloco BEGIN. Assumindo o GNU Awk:

 BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } } 

No bloco de processamento principal, você lê a linha do Arquivo 1 e imprime com os dados corretos das matrizes criadas no bloco BEGIN:

 { print $0, f[$1], g[$1] } 

Forneça o arquivo 1 como o argumento do nome de arquivo ao programa.

 awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } } print $0, f[$1], g[$1] }' "File 1" 

As aspas ao redor do argumento do nome do arquivo são necessárias devido aos espaços no nome do arquivo. Você precisa das aspas ao redor do nome do arquivo getline mesmo que ele não contenha espaços, pois, do contrário, seria um nome de variável.

 awk 'BEGIN{OFS=","} FNR==NR {F[$1]=$2;G[$1]=$3;next} {print $1,$2,$3,$4,$5,F[$1],G[$1]}' file2.txt file1.txt