我必须连接两个矩阵。
$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