2 つの行列を結合する際の出力パラメーターは?

2 つの行列を結合する際の出力パラメーターは?

2 つの行列を結合する必要があります。

$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使用してマトリックス 1 のすべての列を指定できるのでしょうか。また、最終的に結合されたマトリックスとして必要なのは、そのうちの 1 つの列だけです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このようなタスクを処理する一般的な方法の1つは、の代わりにを使用することですjoin。まず、1つのファイルのエントリから連想配列を作成し、次に、共通列をキーとして使用して、他のファイルを処理するときに対応する値を検索します。たとえば、あなたの場合、

$ 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

関連情報