Я фильтрую файл размером 580 МБ, используя содержимое другого меньшего файла. File1 (меньший размер файла)Perl/Linux, фильтрующий большой файл с содержимым другого файла
chr start End
1 123 150
2 245 320
2 450 600
File2 (большой файл)
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) против' '(backtick)' '(= execute)). Но независимо от того, вы правы. – PerlDuck