Я задал этот вопрос (извините за повторный запрос, на этот раз он другой и сложный), но я много пробовал, но не достиг результатов.
У меня 2 больших файла (с разделителями табуляции).
первый файл ->
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
101_#2 1 H F0 263 278 2 1.5
102_#1 1 6 F1 766 781 1 1.0
103_#1 2 15 V1 526 581 1 0.0
103_#1 2 9 V2 124 134 1 1.3
104_#1 1 12 V3 137 172 1 1.0
105_#1 1 17 F2 766 771 1 1.0
второй файл ->
Col1 Col2 Col3 Col4
97486 H 262 279
67486 9 118 119
87486 9 183 185
248233 9 124 134
Если значение / символ col3 (файла1) и значение / символ col2 (файла)2) совпадают, а затем сравнивают col5 и col6 файла 1 (например, значение диапазона) с col3 и col4 файла2, если диапазон файла 1 присутствует в файле 2, возвращает эту строку (из файла1), а также добавляет дополнительный столбец1из файла 2 в выводе.
Ожидаемый вывод ->
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
101_#2 1 H F0 263 278 2 1.5 97486
103_#1 2 9 V2 124 134 1 1.3 248233
До сих пор я пробовал что-то с хэшами ->
@ARGV or die "No input file specified";
open my $first, '<',$ARGV[0] or die "Unable to open input file: $!";
open my $second,'<', $ARGV[1] or die "Unable to open input file: $!";
print scalar (<$first>);
while(<$second>){
chomp;
@line=split /\s+/;
$hash{$line[2]}=$line[3];
}
while (<$first>) {
@cols = split /\s+/;
$p1 = $cols[4];
$p2 = $cols[5];
foreach $key (sort keys %hash){
if ($p1>= "$key"){
if ($p2<=$hash{$key})
{
print join("\t",@cols),"\n";
}
}
else{ next; }
}
}
Но нет сравнения col3значение / символ (из файла 1) и значение / символ col2 (из файла 2) в приведенном выше коде.Но это также отнимает много времени и памяти. Кто-нибудь может подсказать, как я могу сделать это быстро, используя хэши или хэши хешей. Большое спасибо.
Привет всем,
Большое спасибо затвоя помощь.Я нашел эффективный способ для моего собственного вопроса.
@ARGV or die "No input file specified";
open $first, '<',$ARGV[0] or die "Unable to open input file: $!";
open $second,'<', $ARGV[1] or die "Unable to open input file: $!";
print scalar (<$first>);
while(<$second>){
chomp;
@line=split /\s+/;
$hash{$line[1]}{$line[2]}{$line[3]}= $line[0];
}
while (<$first>) {
@cols = split /\s+/;
foreach $key1 (sort keys %hash) {
foreach $key2 (sort keys %{$hash{$key1}}) {
foreach $key3 (sort keys %{$hash{$key1}{$key2}}) {
if (($cols[2] eq $key1) && ($cols[4]>=$key2) && ($cols[5]<=$key3)){
print join("\t",@cols),"\t",$hash{$key1}{$key2}{$key3},"\n";
}
last;
}
}
}
}
Это правильно?