連接兩個矩陣的輸出參數?

連接兩個矩陣的輸出參數?

我必須連接兩個矩陣。

$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

相關內容