¿Cómo combinar dos archivos usando AWK?

El archivo 1 tiene 5 campos ABCDE, con el campo A es un valor entero

El archivo 2 tiene 3 campos AFG

El número de filas en el Archivo 1 es mucho más grande que el del Archivo 2 (20 ^ 6 a 5000)

Todas las entradas de A en el archivo 1 aparecieron en el campo A en el archivo 2

Me gusta fusionar los dos archivos por el campo A y llevar F y G

La salida deseada es ABCDEFG

Ejemplo

Archivo 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 

Archivo 2

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

Salida deseada

 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 

Afortunadamente, no es necesario que escriba esto en absoluto. Unix tiene un comando de unirse para hacer esto por usted.

 join -1 1 -2 1 File1 File2 

Aquí está “en acción”:

 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$ 

Necesita leer las entradas del archivo 2 en un par de matrices asociativas en el bloque BEGIN. Asumiendo GNU Awk:

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

En el bloque de procesamiento principal, lee la línea del archivo 1 e imprime con los datos correctos de las matrices creadas en el bloque BEGIN:

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

Suministre el archivo 1 como el argumento del nombre de archivo del progtwig.

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

Las comillas en torno al argumento del nombre de archivo son necesarias debido a los espacios en el nombre del archivo. Necesita las comillas alrededor del nombre de archivo getline incluso si no contiene espacios, ya que de lo contrario sería un nombre de variable.

 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