¿Cómo puedo hacer coincidir la primera columna del archivo 1 de acuerdo con los números de la segunda columna con el archivo 2?
Archivoarchivo1
k002 25
k004 54
k003 23
Archivoarchivo2
25 h
23 j
54 hg
Salida deseada
k002 25 h
k003 23 j
k004 54 hg
No tengo idea de cómo hacer eso y no encontré preguntas similares.
awk 'matching {print ... $1, $2}' file1 file2 > file_des
Respuesta1
Quizás podrías hacer algo como esto:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
Dónde:
FNR
: El número de registro de entrada en el archivo de entrada actual.NR
: el número total de registros de entrada vistos hasta el momento.
Tenga en cuenta que esto se leerá completo file1
en la memoria.
Respuesta2
Si no le importa conservar el orden de los archivos originales, puede utilizar join
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
O como lo sugiere @Ed Morton, si usa bash
cualquier otro shell que admita la sustitución de procesos, puede evitar la creación de archivos temporales de esta manera:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
Respuesta3
Usando awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
Este comando NR==FNR
garantiza que {ar[$2]=$0;next}
funcionará solo para el primer archivo porque después de leer el primer archivo FNR
se establecerá en cero. En la expresión se crea {ar[$2]=$0;next}
una matriz ar
indexada y no se realizan más acciones.$2
next
La expresión ($1 in ar)
ve si $1
(primer campo del segundo archivo) está presente eníndicesde matriz ar
. Si está presente, se imprime ar
el segundo campo del segundo archivo mediante esta declaración {print ar[$1],$2}
.
($1 in ar)
es importante porque esto significa si $1 del segundo archivo coincideíndicesde ar
. Y ar
está indexado en $2 del primer archivo. Entonces esto verifica si $1
el segundo archivo coincide $2
con el primer archivo.