将一个文件的列与其他文件的范围进行比较,并保留属于范围的行

时间:2017-10-31 14:50:39

标签: r bash awk

我有两个文件:

1)a

        code    chr    position    score            
code123947     10       13417     0.9221900
code456747     10      717559     1.0000000
code523452     10     1554421     0.5315330
code223534     10     2354490     0.0479356
code654321     10     4461920     0.9144420
code345635     10     5564649     0.7069120
code214234     10      115746     0.7191680
code654332     10      133160     0.4205290
code263562     10      135203     0.7178790
code987654     10      230894     0.5351590

2)b

chr      start   stop
10   60523   751339
10   751339      1523544
10   1523544     2254500
10   2254500     3352699
10   3352699     4572274
10   4572274     5983762
10   5983762     7171484
10   7171484     8774665
10   8774665     10249396

我需要子文件" a"仅用于匹配" chr" "位置"落入"开始" - "停止"文件" b"

我尝试了以下内容:

awk 'NR==FNR{ range[$1,$2,$3]; next }
FNR==1
{
for(x in range) {
split(x, check, SUBSEP);
if($2==check[1] && $3>=check[2] && $3<=check[3]) print $0
}}
' b a 

但这只会返回一个未经改动的&#34; a&#34;

我也试图在R中处理这个问题:

 a[a$V2 == b$chr && a$V3 >= b$start && a$V3 <= b$stop, ]
我知道

是无用的,因为这会将列并排比较。它会抛出一个错误,告诉我&#34;较长的物体长度不是较短物体长度的倍数&#34;。

我还尝试使用&#34; foverlaps&#34;在data.table中使用&#34; b&#34;列作为键

不幸的是,这是我现在最好的。

有什么建议吗?我正在寻找的输出是:

code    chr    position    score 
code456747     10      717559     1.0000000
code523452     10     1554421     0.5315330
code223534     10     2354490     0.0479356
code654321     10     4461920     0.9144420
code345635     10     5564649     0.7069120

感谢!!!

2 个答案:

答案 0 :(得分:1)

x <- merge(a, b, by = 'chr')
x <- x[x$V3 >= x$start && x$V3 <= x$stop, ]

您可以将两个数据框合并在一起,然后像过去一样进行过滤。

答案 1 :(得分:0)

join辅助awk

类似
$ join -12 -21 a b | awk '$5<=$3 && $3<=$6{print $2,$1,$3,$4}'

code456747 10 717559 1.0000000
code523452 10 1554421 0.5315330
code223534 10 2354490 0.0479356
code654321 10 4461920 0.9144420
code345635 10 5564649 0.7069120
code214234 10 115746 0.7191680
code654332 10 133160 0.4205290
code263562 10 135203 0.7178790
code987654 10 230894 0.5351590

PS。文件需要在关键字段上排序