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

3

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 mat1 tem cerca de 20.000 colunas, por isso não é possível escrever 1.1 1.2 ..1.20.000 que variação para o parâmetro -o pode ser usada para indicar todas as colunas da matriz uma e somente uma coluna de mat2 é necessário como a matriz mesclada final.

    
por zeenia 11.10.2014 / 12:17

2 respostas

2

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 cut para selecionar as colunas apropriadas primeiro e depois participar:

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

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

cut -f-19999 mat1 | join -t ' ' - <(cut -f1,4 mat2)
    
por 11.10.2014 / 14:16
0

Uma maneira comum de lidar com tarefas como esta é usar awk em vez de join : primeiro construindo uma matriz associativa a partir das entradas em um arquivo e, em seguida, procurando os valores correspondentes ao processar o outro arquivo, usando o 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
    
por 11.10.2014 / 17:40

Tags