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:
awk
recorre implícitamente cada archivo, una línea a la vez. Como lo dimos file2
como primer argumento, se lee primero. file1
se lee en segundo lugar.
FNR==NR{a[$1]=$2;next}
NR
es el número de líneasawk
leídas hasta ahora yFNR
es el número de líneasawk
leídas hasta ahora del archivo actual. Por lo tanto, siFNR==NR
todavía estamos leyendo el primer archivo nombrado:file2
. Para cada línea defile2
, asignamosa[$1]=$2
.Aquí
a
hay unmatriz asociativaya[$1]=$2
significa guardar la segunda columna del archivo2, indicada$2
como un valor en una matriza
usando la primera columna del archivo2,$1
como clave.next
le indicaawk
que 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 enfile2
, según lo determinado por el contenido de la matriza
, 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 -o
anulará 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 File2
al primer archivo File1
.
join <(sort -k1 file2) <(sort -k1 file1)