¿Cómo puedo agregar una columna a un archivo que coincida con otra columna?

¿Cómo puedo agregar una columna a un archivo que coincida con otra columna?

¿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 file1en 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 bashcualquier 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==FNRgarantiza que {ar[$2]=$0;next}funcionará solo para el primer archivo porque después de leer el primer archivo FNRse establecerá en cero. En la expresión se crea {ar[$2]=$0;next}una matriz arindexada y no se realizan más acciones.$2next

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 arel 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 arestá indexado en $2 del primer archivo. Entonces esto verifica si $1el segundo archivo coincide $2con el primer archivo.

información relacionada