web-dev-qa-db-ja.com

2つの列の一致に基づいて2つのファイルをマージするにはどうすればよいですか?

私は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に配置します。

32
Dadong Zhang

これはそれを行うはずです:

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番目のフィールドを出力します。

49
terdon

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]から対応する保存された列を追加します。

17
grebneke

注文が必要ない場合は、簡単な解決策よりも

paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3

これは、すべての行に3つのエントリがあり、両方のファイルの列1と2が同じであることを前提としています(例のデータと同様)。

6
Bernhard