将一个值与perl上的重叠值范围进行比较

时间:2014-02-25 09:46:25

标签: perl

第一个文件列出了与它们相关的转录因子和基因组区域。它被安排为chr,起始位置,结束位置,转录因子的名称。它看起来像这样:

chr1 10089 10309 ZBTB33
chr1 10132 10536 TAF7_(SQ-8)
chr1 10133 10362 Pol2-4H8
chr1 10148 10418 MafF_(M8194)
chr1 10382 10578 ZBTB33
chr1 16132 16352 CTCF
chr1 29308 29578 TAF1
chr1 29328 29558 HEY1
chr2 89802 90046 USF-1
chr4 91180 91560 CTCF

请注意,许多地区重叠。

第二个文件很简单。一列查询。它看起来像这样:

chr1_10350
chr1_12090
chr1_16250
chr1_24512
chr5_1142341

我希望获得报告查询及其相关转录因子的输出。像这样:

chr1_10350 TAF7_(SQ-8)
chr1_10350 Pol2-4H8
chr1_10350 MafF_(M8194)
chr1_10350 ZBTB33
chr1_16250 CTCF

我尝试了从(match one list to another)修改的perl脚本:

#!/usr/bin/perl 
use warnings;
use strict;

open(my $db, "<", "first_file.txt") or die "Cannot open < first_file.txt: $!";
open(my $tst, "<", "second_file.txt") or die "Cannot open < second_file.txt: $!";
open (OUT, ">Result.txt") or die "Cannot create output file";

my @database;

while (<$db>) {
    chomp;
    my @fields = split;
    push @database, \@fields;
}

while (my $line = <$tst>) {
    chomp($line);
    my ($chr, $pos) = split /_/, $line;
    foreach my $entry (@database) {
        if ($chr eq $entry->[0] && $entry->[1] <= $pos && $pos <= $entry->[2]) {
            print OUT "$line $entry->[3]\n";
        }
    }
}

但它不仅非常慢,而且来自第二个文件(例如chr1_10350)的重复查询只会导致输出中的一个条目而不是所有条目。

非常感谢指导。感谢。

2 个答案:

答案 0 :(得分:0)

我已经对您在我的机器上提供的数据执行了您的脚本(Win7,ActiveState Perl v5.16)并且它运行良好。
只需注意一点:结果数据只包含4个元素(这是正确的):

    chr1_10350 TAF7_(SQ-8)
    chr1_10350 Pol2-4H8
    chr1_10350 MafF_(M8194)
    chr1_16250 CTCF

答案 1 :(得分:-1)

您可以尝试使用以下bash,使用系统命令

执行它

join -t''-1 1 -2 1&lt;(cat second_file.txt | awk'{gsub(/ _ /,“”,$ 1); print $ 0}')first_file.txt | cut -d' '-f1,2,5 | awk -F'''{print $ 1“_”$ 2“”$ 3;}'