¿Parámetro de salida al unir dos matrices?

¿Parámetro de salida al unir dos matrices?

Tengo que unir dos matrices.

$cat mat1:

sample  gen1    gen2    gen3    gen4  
pt1     1       4       7       10  
pt3     5       5       8       11 
pt4     3       6       9       12  

$cat mat2:

sample  age gender  stage   etc  
pt0     5   m       stage1  poi  
pt1     6   f       stage2  bmn  
pt2     9   m       stage3  yup   
pt3     7   f       stage4  qaz  
pt4     6   f       stage2  bmn

$join -o 1.1 1.2 1.3 1.4 2.4 mat1 mat2:

sample gen1 gen2 gen3 stage  
pt1    1    4    7    stage2  
pt3    5    5    8    stage4  
pt4    3    6    9    stage2  

Mi matriz real mat1tiene alrededor de 20.000 columnas, por lo que no es factible escribir 1.1 1.2 ..1.20,000 qué variación del -oparámetro se puede usar para indicar todas las columnas de la matriz uno y solo mat2se requiere una columna como matriz fusionada final.

Respuesta1

No existe tal opción para -o(de man join):

-o FORMAT
       obey FORMAT while constructing output line

   FORMAT is one or more comma  or  blank  separated
   specifications,  each  being  `FILENUM.FIELD'  or `0'.  Default FORMAT
   outputs the join field, the remaining fields from FILE1, the remaining
   fields  from  FILE2,  all separated by CHAR.  If FORMAT is the keyword
   'auto', then the first line of each  file  determines  the  number  of
   fields output for each line.

Utilice cutpara seleccionar las columnas apropiadas primero y luego unirlas:

join -t ' ' mat1 <(cut -f1,4 mat2)

(es un carácter de tabulación entre comillas: Ctrl+ V, TAB),
o para todas las columnas hasta 19999 mat1puedes hacer:

cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)

Respuesta2

Una forma común de manejar tareas como esta es usar awken lugar de join: primero construir una matriz asociativa a partir de las entradas de un archivo y luego buscar los valores correspondientes al procesar el otro archivo, usando la columna común como clave. En tu caso por ejemplo

$ awk 'NR==FNR {stage[$1]=$4; next;}; {print $0,stage[$1]}' mat2 mat1
sample  gen1    gen2    gen3    gen4   stage
pt1     1       4       7       10   stage2
pt3     5       5       8       11  stage4
pt4     3       6       9       12   stage2

información relacionada