我正在使用另一个较小文件的内容过滤580 MB文件。 File1中(较小的文件)Perl/Linux过滤大文件与其他文件的内容
chr start End
1 123 150
2 245 320
2 450 600
文件2(大文件)
chr pos RS ID A B C D E F
1 124 r2 3 s 4 s 2 s 2
1 165 r6 4 t 2 k 1 r 2
2 455 t2 4 2 4 t 3 w 3
3 234 r4 2 5 w 4 t 2 4
我想如果下列条件满足,以捕获来自文件2行。 File2.Chr == File1.Chr && File2.Pos > File1.Start && File2.Pos < File1.End
我试过使用awk,但它运行速度非常慢,我也想知道是否有更好的方法来实现相同?
谢谢。
这里是我正在使用的代码:
#!/usr/bin/perl -w
use strict;
use warnings;
my $bed_file = "/data/1000G/Hotspots.bed";#File1 smaller file
my $SNP_file = "/data/1000G/SNP_file.txt";#File2 larger file
my $final_file = "/data/1000G/final_file.txt"; #final output file
open my $in_fh, '<', $bed_file
or die qq{Unable to open "$bed_file" for input: $!};
while (<$in_fh>) {
my $line_str = $_;
my @data = split(/\t/, $line_str);
next if /\b(?:track)\b/;# skip header line
my $chr = $data[0]; $chr =~ s/chr//g; print "chr is $chr\n";
my $start = $data[1]-1; print "start is $start\n";
my $end = $data[2]+1; print "end is $end\n";
my $cmd1 = "awk '{if(\$1==chr && \$2>$start && \$2</$end) print (\"chr\"\$1\"_\"\$2\"_\"\$3\"_\"\$4\"_\"\$5\"_\"\$6\"_\"\$7\"_\"\$8)}' $SNP_file >> $final_file"; print "cmd1\n";
my $cmd2 = `awk '{if(\$1==chr && \$2>$start && \$2</$end) print (\"chr\"\$1\"_\"\$2\"_\"\$3\"_\"\$4\"_\"\$5\"_\"\$6\"_\"\$7\"_\"\$8)}' $SNP_file >> $final_file`; print "cmd2\n";
}
你在一个循环中调用'awk'两次。难怪为什么它很慢。对python解决方案感兴趣? –
当然,一直想学python。谢谢 – user3781528
@ Jean-FrançoisFabre实际上只有第二行('$ cmd2 = ...')调用awk。 '$ cmd1 = ...'行只设置一个字符串变量。我们可以从使用的不同引号('''= assign)与''(反引号)'(= execute)')看到,但无论如何,你说得对。 – PerlDuck