Fusionar 2 archivos según la coincidencia de campos

Fusionar 2 archivos según la coincidencia de campos

Quiero crear un archivo que contenga columnas de dos archivos de entrada. Archivo1 es como:

aa 32
bb 15
cc 78

Archivo2 es:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

La tarea es leer Archivo1, si el primer campo de una fila existe entre el primer campo de Archivo2, luego imprimir esa línea de Archivo2, con ambas columnas y agregar la entrada de la segunda columna de Archivo1 que contiene el primer campo.

La salida debería ser como:

aa 45 32
bb 31 15
cc 50 78

Se prefiere awk para el script.

Respuesta1

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

Explicación:

awkrecorre implícitamente cada archivo, una línea a la vez. Como lo dimos file2como primer argumento, se lee primero. file1se lee en segundo lugar.

  • FNR==NR{a[$1]=$2;next}

    NRes el número de líneas awkleídas hasta ahora y FNRes el número de líneas awkleídas hasta ahora del archivo actual. Por lo tanto, si FNR==NRtodavía estamos leyendo el primer archivo nombrado: file2. Para cada línea de file2, asignamos a[$1]=$2.

    Aquí ahay unmatriz asociativay a[$1]=$2significa guardar la segunda columna del archivo2, indicada $2como un valor en una matriz ausando la primera columna del archivo2, $1como clave.

    nextle indica awkque omita el resto de los comandos y comience de nuevo con la siguiente línea.

  • ($1 in a) {print $1,a[$1],$2}

    Si llegamos hasta aquí, significa que estamos leyendo el segundo archivo: file1. Si vimos el primer campo de la línea en file2, según lo determinado por el contenido de la matriz a, imprimimos una línea con los valores del campo 2 de ambos archivos.

Respuesta2

Me gusta la solución awk pero creo que esto podría ser más fácil:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

La opción -oanulará el formato que seleccionará como primer campo del primer archivo, segundo campo del segundo archivo y segundo campo del primer archivo.

Respuesta3

Une el segundo archivo File2al primer archivo File1.

join <(sort -k1 file2) <(sort -k1 file1)

información relacionada