Я пытаюсь найти общие строки среди двух разделенных табуляцией файлов на одном поле. Одна строка первого файла:Как быстро найти общие предметы из двух массивов?
1 52854 s64199.1 A . . . PR GT 0/0
Одна строка второго файла:
chr1 52854 . C T 215.302 . AB=0.692308;ABP=7.18621;AC=1;AF=0.5;AN=2;AO=9;CIGAR=1X;DP=13;DPB=13;DPRA=0;EPP=3.25157;EPPR=3.0103;GTI=0;LEN=1;MEANALT=1;MQM=60;MQMR=60;NS=1;NUMALT=1;ODDS=17.5429;PAIRED=0;PAIREDR=0.25;PAO=0;PQA=0;PQR=0;PRO=0;QA=318;QR=138;RO=4;RPP=3.25157;RPPR=5.18177;RUN=1;SAF=0;SAP=22.5536;SAR=9;SRF=1;SRP=5.18177;SRR=3;TYPE=snp;technology.illumina=1;BVAR GT:DP:RO:QR:AO:QA:GL 0/1:13:4:138:9:318:-5,0,-5
Основываясь на втором поле (52854) в этом примере у меня есть много. Вот мой код, который находит общие, но мои файлы довольно большие и занимают много времени. Есть ли способ ускорить процесс? Спасибо вам большое заблаговременно.
#!/app/languages/perl/5.14.2/bin/perl
use strict;
use warnings;
my $map_file = $ARGV[0];
my $vcf_file = $ARGV[1];
open my $map_info, $map_file or die "Could not open $map_file: $!";
my @map_array =();
my @vcf_array =();
while(my $mline = <$map_info>) {
chomp $mline;
my @data1 = split('\t', $mline);
my $pos1 = $data1[1];
push (@map_array, $pos1);
}
open my $vcf_info, $vcf_file or die "Could not open $vcf_file: $!";
while(my $line = <$vcf_info>) {
if ($line !~ m/^#/) {
push (@vcf_array, $line);
}
}
foreach my $a (@map_array) {
chomp $a;
foreach my $b (@vcf_array) {
chomp $b;
my @data = split('\t', $b);
my $pos2 = $data[1];
my $ref2 = $data[3];
my $allele = $data[4];
my $genotype = $data[9];
if ($a == $pos2) {
print $pos2 . "\t" . $ref2. "\t".$allele."\t".$genotype. "\n";
#print "$b\n";
}
}
}
Вместо того, чтобы загружать данные в несколько массивов, я бы использовал один хэш, где ключи являются значениями второго поля. Затем, когда вы перебираете второй файл, извлекаете нужные поля и выполняете простой поиск хэша на ключе. Если он существует, выведите данные. Использование этого подхода будет использовать меньше памяти и не нуждается в вложенных петлях foreach. –
Ваши вложенные петли foreach являются основной причиной неэффективности, поскольку она многократно перебирает полный набор данных из второго файла (один раз для каждой строки в первом файле). Используя хэш-подход, я предложил только один цикл над вторым файлом один раз. –
Большое спасибо за ваш ответ. Что значит «сделать простой хэш-поиск по ключу»? – Vasilis