私はfile1が好きです:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
そしてfile2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
次のようなfile3が必要です。
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
つまり、file2の4番目の列を2番目の列の名前でfile1に配置します。
これはそれを行うはずです:
join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2
重要:これは、ファイルが(例のように)SNP名に従ってソートされていることを前提としています。そうでない場合は、最初に並べ替えます。
join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
info join
から):`join 'は、同じ結合フィールドを持つ入力行の各ペアの行を標準出力に書き込みます。
`-1 FIELD'
Join on field FIELD (a positive integer) of file 1.
`-2 FIELD'
Join on field FIELD (a positive integer) of file 2.
`-j FIELD'
Equivalent to `-1 FIELD -2 FIELD'.
`-o FIELD-LIST'
Otherwise, construct each output line according to the format in
FIELD-LIST. Each element in FIELD-LIST is either the single
character `0' or has the form M.N where the file number, M, is `1'
or `2' and N is a positive field number.
したがって、上記のコマンドは2番目のフィールドでファイルを結合し、ファイル1の1番目、2番目、3番目のフィールドを出力し、その後にfile2の3番目のフィールドを出力します。
awk
を使用できます:
$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3
出力:
$ cat file3
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
説明:
file2
をウォークスルーします(NR==FNR
は最初のファイル引数に対してのみtrueです)。列2をキーとして使用して、列3をハッシュ配列に保存します:h[$2] = $3
。次に、file1
をウォークスルーして、3つの列$1,$2,$3
をすべて出力し、ハッシュ配列h[$2]
から対応する保存された列を追加します。
注文が必要ない場合は、簡単な解決策よりも
paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3
これは、すべての行に3つのエントリがあり、両方のファイルの列1と2が同じであることを前提としています(例のデータと同様)。