我正在使用另一個較小文件的內容過濾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