基于两列连接两个文件

时间:2011-09-12 18:27:35

标签: bash awk

信不信由你,我在互联网上搜索过,并没有找到解决这个问题的工作方案。

我有两个文件,A和B:

档案A:

chr1   pos1   
chr1   pos2
chr2   pos1
chr2   pos2

档案B:

chr1 pos1
chr2 pos1
chr3 pos2

期望的输出:

chr1 pos1
chr2 pos1

我想加入这两个文件,基本上根据第一列和第二列,而不仅仅是第一列,得到两个文件之间的交集。由于这种情况,大多数简单的脚本都不起作用,加入似乎不是一种选择。

有什么想法吗?

编辑:对不起,我没有提到列数多于我展示的两列。我在我的例子中只显示了两个因为我只对两个文件之间的前两列相同感兴趣,其余的数据并不重要(但仍然在文件中)

4 个答案:

答案 0 :(得分:10)

嗯,我的想法如下: 使用join合并两个文件并使用awk

更正
$ join  A B 
chr1 pos1 pos1
chr1 pos2 pos1
chr2 pos1 pos1
chr2 pos2 pos1

$ join  A B | awk '{ if ($2==$3) printf("%s %s\n", $1, $2) }'
chr1 pos1 pos1
chr2 pos1 pos1

编辑:给定编辑,连接解决方​​案可能仍然有效(带选项),因此概念保持正确(imo)。

答案 1 :(得分:4)

awk解决方案是:

awk 'FILENAME==ARGV[1] {pair[$1 " " $2]; next} ($1 " " $2 in pair)' fileB fileA

首先放置较小的文件,因为你必须将它基本保存在内存中。

答案 2 :(得分:2)

我会这样写:

awk 'NR == FNR {
  k[$1, $2]
  next
  }
($1, $2) in k
  ' filea fileb  

可能需要根据具体要求调整输入文件的顺序。

答案 3 :(得分:1)

为什么不简单grep -f这样:

grep -f fileB fileA

编辑:

对于包含2列以上列的文件,请尝试:

grep "$(cut -d" " -f1,2 fileB)" fileA | cut -d" " -f1,2