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