从单独的文件加入两列

时间:2016-01-12 15:03:42

标签: bash shell join multiple-columns

我有两个文件:

File1中:

   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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

by awk

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