第一个文件列出了转录因子和与之相关的基因组区域。它排列有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
我尝试了一个修改后的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)的重复查询只会导致输出中的一个条目,而不是所有条目。
如能提供指导,将不胜感激。谢谢。
我已经在机器上提供的数据(Win7,ActiveState Perl v5.16)上执行了您的脚本,并且效果很好。
只有一个注意事项:结果数据仅包含 4 个元素(这是正确的):
chr1_10350 TAF7_(SQ-8)
chr1_10350 Pol2-4H8
chr1_10350 MafF_(M8194)
chr1_16250 CTCF
尝试使用以下bash,使用系统命令执行它
join -t' ' -1 1 -2 1 <(cat second_file.txt |awk '{gsub(/_/," ",$1);p rint $0}') first_file.txt|cut -d' ' -f1,2,5|awk -F' ' '{print $1"_"$2" "$3;}'