Выходной параметр при соединении двух матриц?

Выходной параметр при соединении двух матриц?

Мне нужно объединить две матрицы.

$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(из 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

Связанный контент