我必須連接兩個矩陣。
$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