Parâmetro de saída na união de duas matrizes?

Parâmetro de saída na união de duas matrizes?

Eu tenho que juntar duas matrizes.

$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  

Minha matriz real mat1tem cerca de 20.000 colunas, portanto não é viável escrever 1,1 1,2 ..1,20,000 qual variação do -oparâmetro pode ser usada para indicar todas as colunas da matriz uma e apenas uma coluna mat2é necessária como a matriz mesclada final.

Responder1

Não existe essa opção 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.

Use cutpara selecionar as colunas apropriadas primeiro e depois unir:

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

(que é um caractere de tabulação entre aspas: Ctrl+ V, TAB),
ou para todas as colunas até 19999 mat1você pode fazer:

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

Responder2

Uma maneira comum de lidar com tarefas como essa é usar awkem vez de join: primeiro construir uma matriz associativa a partir das entradas em um arquivo e, em seguida, procurar os valores correspondentes ao processar o outro arquivo, usando a coluna comum como chave. No seu caso por exemplo

$ 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

informação relacionada