连接两个矩阵的输出参数?

连接两个矩阵的输出参数?

我必须连接两个矩阵。

$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  

我的实际矩阵mat1有大约 20,000 列,因此编写 1.1 1.2 ..1.20,000 不可​​行,-o可以使用参数的哪些变化来说明矩阵一的所有列,并且只mat2需要其中一列作为最终合并矩阵。

答案1

-o(from )没有这样的选项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.

使用cut首先选择适当的列,然后连接:

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

(即引号之间的制表符:Ctrl+ V, TAB),
或者对于最多 19999 的所有列,mat1您可以执行以下操作:

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

答案2

处理此类任务的一种常见方法是使用awk而不是join:首先根据一个文件中的条目构造一个关联数组,然后在处理另一个文件时使用公共列作为键查找相应的值。以你的情况为例

$ 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

相关内容