【问题标题】:Join on two columns from seperate files加入来自不同文件的两列
【发布时间】:2016-01-12 15:03:42
【问题描述】:

我有两个文件:

文件1:

   chr1 100736194  46   0.731   +   100735713   100736636
   chr1 100736194  49   0.879   +   100735723   100736646
   chr1 100736196  54   0.952   +   100735753   100736666

文件2:

   chr1 100735713  100736636  +  BMCHAS
   chr1 100735723  100736646  +  ATCGSG
   chr1 100735753  100736666  +  BDUSUS

我想加入文件1和2基于

  • file1 的第 6 列和第 7 列,以及
  • file2 的第 2 列和第 3 列

输出类似:

   chr1 100736194  46   0.731   +   100735713   100736636  BMCHAS
   chr1 100736194  49   0.879   +   100735723   100736646  ATCGSG
   chr1 100736196  54   0.952   +   100735753   100736666  BDUSUS

我不知道如何将 join 用于多个列,我查找了一个 awk 解决方案并一直在尝试实现它,但我认为我在某个地方不正确,我正在使用的命令是:awk 'NR==FNR{a[$1,$2]=$5;next}{$3=a[$7,$8];print}' OFS='\t' file2 file1,

此外,重要的是不要匹配每个文件中的一列,而是匹配两列,因为单列不够唯一。这意味着我不能使用单列匹配解决方案,例如仅将 file1 的第 6 列与 file2 的第 2 列匹配,它必须使用上面的多个指定列。

提前致谢。

【问题讨论】:

  • 如果您标记 bash 或 shell 或其他东西,可能会得到更多答案
  • 是否可以只加入一个字段,例如 file1 的第 6 列匹配 file2 的第 2 列?
  • 我想我宁愿同时使用两者,因为各个列不是唯一的

标签: bash shell join multiple-columns


【解决方案1】:

您仍然可以使用join。诀窍是将两列连接在一起,以便将它们视为一列。

我在这里用sed 完成了它,但你可以使用awk 或任何你喜欢的东西。

<(..) 语法是特定于 bash 的,大​​致意思是“创建一个临时命名管道并将其作为文件传递”。

join \
   -1 6  \
   -2 2  \
   -o "1.1 1.2 1.3 1.4 1.5 0 2.4"  \
   <(sed 's/\([0-9]\{9\}\) *\([0-9]\{9\}\)/\1-\2/' file1) \
   <(sed 's/\([0-9]\{9\}\) *\([0-9]\{9\}\)/\1-\2/' file2) \
 | sed 's/-/  /'

这适用于 GNU sed(我有 4.2.2);您可能需要对其他 sed 实现进行调整。

输入sed 命令将您的输入文件转换为如下所示:

chr1 100736194  46   0.731   +   100735713-100736636

输出sed 命令撤消更改。

输出格式 (-o "1.1 1.2 1.3 1.4 1.5 0 2.4") 给出了您要求的输出:

chr1 100736194 46 0.731 + 100735713  100736636 BMCHAS
chr1 100736194 49 0.879 + 100735723  100736646 ATCGSG
chr1 100736196 54 0.952 + 100735753  100736666 BDUSUS

【讨论】:

    【解决方案2】:

    通过 awk

     awk ' NR==FNR{ a[$2 FS $3]=$5;next} ($6 FS $7) in a { print $0 FS a[$6 FS $7]} ' file2 file1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 2016-12-21
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多