【问题标题】:Joining several files based on first file基于第一个文件加入多个文件
【发布时间】:2020-10-27 06:37:52
【问题描述】:

我正在尝试根据特定文件中的列连接多个文件,即“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 awk paste


【解决方案1】:

您可以使用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 查看两个文件中的第一列是否匹配,-o1.1,2.2,2.3 告诉 join 打印第一个文件 (1.1) 的第一列,第二个文件的第二列 ( 2.2) 和第二个文件的第三列 (2.3)。 -e "." 告诉 join 用点填充任何空白。输入需要排序,所以&lt;(sort file)用于在加入前对内容进行排序。下一步是将临时文件与 test_3 文件连接起来。选项相同,但打印的列不同。

【讨论】:

  • 嗨@jared_mamrot,感谢您的解释。对于“2.2,2.3”中的数字,我知道 2 和 3 意味着在 2 和 3 处都显示列。如果我有很多其他列,我需要所有列而不是说明哪些列?
  • 你可以试试-o auto而不是指定列,但我不知道它是否能解决你的问题。将来,请提供您正在使用的数据的更好示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多