【发布时间】:2014-09-15 08:46:53
【问题描述】:
输入文件1:
col1 col2 col3 col4
ZGLP1 ICAM4 13.27 0.2425
ICAM4 ZGLP1 13.27 0.2425
RRP1B CDH24 20.8 1
ZGLP1 OOEP 18.79 0.3060
ZGLP1 RRP1B 39.62 0.2972
ZGLP1 CDH24 51.21 0.2560
BBCDI DND1 19.44 0.2833
BBCDI SOHLH2 36.61 0.2909
DND1 SOHLH2 18 0.8
输入文件2:
chr8 18640000 18960000 ZGLP1 RRP1B CDH24 #gene number here is not fixed can be #4 #5 or more
chr8 19000000 19080000 BBCDI DND1 SOHLH2 #gene number here is not fixed can be #4 #5 or more
我编写了一个代码,将 file1 的 col1 和 col2 与 file2 的每一行进行比较,这样,如果这对中的任何一个落在 file2 行中的任何位置,则程序应打印“染色体 pos1 pos2 和 file1 的匹配内容有价值观
输出文件:
chr8 18640000 18960000 ZGLP1 RRP1B 39.62 0.2972
chr8 18640000 18960000 ZGLP1 CDH24 51.21 0.2560
chr8 18640000 18960000 RRP1B CDH24 20.8 1
chr8 19000000 19080000 BBCDI DND1 19.44 0.2833
chr8 19000000 19080000 BBCDI SOHLH2 36.61 0.2909
chr8 19000000 19080000 DND1 SOHLH2 18 0.8
到目前为止,我已经尝试过了,但是由于我的输入文件很大 (2gb),所以需要很长时间。
我的 perl 代码
open( AB, "file1" ) || die("cannot open");
open( BC, "file2" ) || die("cannot open");
open( OUT, ">output.txt" );
@file = <AB>;
chomp(@file);
@data = <BC>;
chomp(@data);
foreach $fl (@file) {
if ( $fl =~ /(.*?)\s+(.*?)\s+(.*?)\s+(.*)/ ) {
$one = $1;
$two = $2;
$thr = $3;
$for = $4;
}
foreach $line (@data) {
if ( $line =~ /(.*?)\s+(.*?)\s+(.*?)\s+(.*)+/ ) {
$chr = $1;
$pos1 = $2;
$pos2 = $3;
}
if ( $line =~ /$one/ ) {
if ( $line =~ /$two/ ) {
print OUT $chr, "\t", $pos1, "\t", $pos2, "\t", $fl, "\n";
}
}
}
}
【问题讨论】:
-
您的空闲内存是否 > 2gb?
-
目前您的代码非常慢,因为对于
file1的每一行,它都会解析file2的每一行以检查匹配项。您可以通过只解析每个文件一次来极大地加快速度。我建议您使用其中一个文件中的数据创建索引哈希,然后在解析第二个文件中的数据时参考该哈希值。为什么不先尝试自己解决这个问题,如果解决不了再寻求帮助? -
是的,我正在开发具有 >100 GB 物理内存的 16 GB RAM 系统。
-
基准正则表达式与拆分,使用
index()匹配$one和$two字符串。如果您有足够的内存,请在print OUT之前进行第二次匹配/拆分并缓存结果。并且不需要将第一个文件读入数组。 -
@ialarmedalien 我是 perl 的初学者,请您详细说明在这种情况下如何使用索引哈希