Мне нужно объединить две матрицы.
$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