信不信由你,我在互联网上搜索过,并没有找到解决这个问题的工作方案。
我有两个文件,A和B:
档案A:
chr1 pos1
chr1 pos2
chr2 pos1
chr2 pos2
档案B:
chr1 pos1
chr2 pos1
chr3 pos2
期望的输出:
chr1 pos1
chr2 pos1
我想加入这两个文件,基本上根据第一列和第二列,而不仅仅是第一列,得到两个文件之间的交集。由于这种情况,大多数简单的脚本都不起作用,加入似乎不是一种选择。
有什么想法吗?
编辑:对不起,我没有提到列数多于我展示的两列。我在我的例子中只显示了两个因为我只对两个文件之间的前两列相同感兴趣,其余的数据并不重要(但仍然在文件中)答案 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