如何根据两列的匹配合并两个文件?

Dad*_*ang 40 awk text-processing join bioinformatics

我有 file1 喜欢:

0   AFFX-SNP-000541  NA
0   AFFX-SNP-002255  NA
1   rs12103          0.6401
1   rs12103_1247494  0.696
1   rs12142199       0.7672
Run Code Online (Sandbox Code Playgroud)

还有一个文件2:

0   AFFX-SNP-000541   1
0   AFFX-SNP-002255   1
1   rs12103           0.5596
1   rs12103_1247494   0.5581
1   rs12142199        0.4931
Run Code Online (Sandbox Code Playgroud)

并想要一个 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
Run Code Online (Sandbox Code Playgroud)

这意味着将 file2 的第 4 列按第 2 列的名称放入 file1。

ter*_*don 59

这应该这样做:

join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2
Run Code Online (Sandbox Code Playgroud)

重要提示:这假设您的文件是根据 SNP 名称排序的(如您的示例中所示)。如果不是,请先对它们进行排序:

join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

说明(来自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.
Run Code Online (Sandbox Code Playgroud)

因此,上面的命令连接第二个字段上的文件并打印文件 1 的第 1、2 和 3 字段,然后是文件 2 的第 3 字段。


gre*_*eke 18

你可以使用awk

$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

解释:

遍历file2(NR==FNR仅适用于第一个文件参数)。使用柱2作为密钥保存列3中的散列阵列:h[$2] = $3。然后遍历file1并输出所有三列$1,$2,$3,从 hash-array 附加相应的保存列h[$2]

  • `h[$2] = $3` 是一个哈希赋值。它将“$3”保存为值,将“$2”保存为键。示例:`h["name"] = "大东"`。现在,`print h["name"]`输出`Dadong`。它执行您想要的操作,它与两个文件中的第二列完全匹配。 (2认同)

Ber*_*ard 6

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

paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3
Run Code Online (Sandbox Code Playgroud)

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