如何基于两列的匹配合并两个文件?


33

我有喜欢的文件:

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的第四列放入file1。


1
File2只有三列?
2014年

Answers:


48

应该这样做:

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.

因此,以上命令将文件连接到第二个字段,并打印文件1的第一,第二和第三字段,然后打印文件2的第三字段。


16

您可以使用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

说明:

遍历file2NR==FNR仅对于第一个文件参数为true)。使用第2列作为键将第3列保存在哈希数组中h[$2] = $3。然后遍历file1并输出所有三列$1,$2,$3,并从hash-array追加相应的已保存列h[$2]


非常感谢。只是想知道,“ h [$ 2] = $ 3”是什么意思?实际上,在我的复杂情况下,我需要精确匹配file1 $ 2 == file2 $ 2(按相同顺序没有必要)。
大东张

1
h[$2] = $3是哈希分配。将其另存$3为值和$2键。范例:h["name"] = "Dadong"。现在,print h["name"]输出Dadong。它可以满足您的要求,并且与两个文件的第二列完全匹配。
grebneke 2014年

6

如果您不需要任何订购,那么一个简单的解决方案就是

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

假设所有行都有三个条目,并且两个文件的第1列和第2列都相同(如示例数据中所示)


1
+1非常有用paste
grebneke 2014年

1
@grebneke和Bernhard,因为你似乎是球迷paste,你可以想出办法来回答这个带的coreutils?
terdon


1
@terdon我建议重新考虑输出此s ***的程序
Bernhard

格式没问题,制表符分隔的文件非常不错。无论如何,对于这类数据,您通常对格式没有选择,它来自另一个程序。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.