根据第一个文件加入多个文件

Joining several files based on first file

我正在尝试根据特定文件中的列连接多个文件,即“file1”

file1,作为“锚点”:

rs00001
rs00002
rs00003
rs00004
rs00005

文件 2:

rs00001 chr4:180168624 ANAPC4
rs00002 chr5:67819450   FABP2
rs00004 chr4:115169445  TBC1D1
rs00005 chr4:67815503   MAML3

文件 3:

rs00003 19.65   6   5   1
rs00004 17.23   5   4   1
rs00005 20.95   8   2   0

期望的输出:

rs00001 chr4:180168624 ANAPC4   .   .   .   .
rs00002 chr5:67819450   FABP2   .   .   .   .
rs00003 .   .   19.65   6   5   1
rs00004 chr4:115169445  TBC1D1  17.23   5   4   1
rs00005 chr4:67815503   MAML3   20.95   8   2   0

我试过的代码:

paste file1 file2 file3 

但它只是合二为一,并没有基于file1中的列。

rs00001 rs00001 chr4:180168624 ANAPC4   rs00003 19.65   6   5   1
rs00002 rs00002 chr5:67819450   FABP2   rs00004 17.23   5   4   1
rs00003 rs00004 chr4:115169445  TBC1D1  rs00005 20.95   8   2   0
rs00004 rs00005 chr4:67815503   MAML3   
rs00005     

感谢任何帮助。谢谢!

您可以使用join,但您需要设置一些选项:

join -a1 -o1.1,2.2,2.3 -e "." <(sort test_1) <(sort test_2) > tmp_1
join -a1 -o1.1,1.2,1.3,2.2,2.3,2.4,2.5 -e "." <(sort tmp_1) <(sort test_3) > output

说明:您的示例在 3 个文件中('test_1' 'test_2' 和 'test_3')所以第一步是将 test_1 和 test_2 组合成使用连接的临时文件 (tmp_1)。 -a1 选项告诉 join 查看两个文件的第一列 'matches',-o1.1,2.2,2.3 告诉 join 打印第一个文件 (1.1) 的第一列,第二个第二个文件 (2.2) 的列和第二个文件 (2.3) 的第三列。 -e "." 告诉 join 用点填充任何空白。输入需要排序,所以 <(sort file) 用于在连接之前对内容进行排序。下一步是将临时文件与 test_3 文件合并。选项相同,但打印的列不同。