У меня есть файл, из которого я должен брать каждый запрос и проверять значения Alt_from и Alt_to. Если значения Alt_from и Alt_to перекрываются, проверьте строку с наивысшей оценкой и распечатайте ее в файле вместе с неперекрывающимися значениями.
Входной файл:
Sr.No query score ALIfrom ALIto
1 g1 135.2 93 231
2 g182 40.5 244 296
3 g182 45.4 247 311
4 g182 53.1 302 348
5 g182 50.6 305 362
6 g182 52.9 354 396
7 g182 24.9 357 397
8 g19 45.2 19 181
9 g19 166.8 19 208
10 g19 182.3 27 258
11 g22 94.5 46 139
12 g22 101.3 141 221
13 g22 66.7 230 353
14 g22 36.8 230 391
15 g266 57.7 47 127
16 g266 12.6 343 375
17 g266 17.8 348 375
Ожидаемый результат:
Sr.No query score ALIfrom ALIto
1 g1 135.2 93 231
2 g182 40.5 244 296
4 g182 53.1 302 348
6 g182 52.9 354 396
10 g19 182.3 27 258
11 g22 94.5 46 139
12 g22 101.3 141 221
13 g22 66.7 230 353
15 g266 57.7 47 127
17 g266 17.8 348 375
Я пробовал использовать Perl, но он не проверяет правильность перекрывающихся значений.Под перекрытием я подразумеваю, например, что в запросе g1 (Sr.no 2) диапазон значений Alt_from и Alt_to составляет от 150 до 200, а в запросе g1 (Sr.no 3) диапазон значений Alt_from и Alt_to составляет от 160 до 190. Эти значения старшего номера 3 попадают в диапазон значений старшего номера 2, это перекрытие. В таком случае код должен проверить их балл и взять те, которые набрали наибольшее количество баллов. Как вы можете видеть в ожидаемых результатах, строка со старшим номером 2 удалена из-за низкого балла, а старший номер 3 взят, так как он имеет более высокий балл
Слегка протестированный Perl-скрипт:
#!/usr/bin/env perl
use strict;
use warnings;
my $header = <>;
print $header;
my $query = '';
my @store = ();
LINE: while (<>) {
my ( $line, %data );
$line = $_;
chomp;
@data{qw/sr query score from to/} = split /\s+/;
if ( $data{query} eq $query ) {
for ( my $i = @store - 1 ; $i >= 0 ; $i-- ) {
my %odata = %{ $store[$i]->[1] };
if ( $odata{to} > $data{from} and $odata{from} < $data{to} ) {
# overlap
if ( $data{score} > $odata{score} ) { splice @store, $i, 1 }
else { next LINE }
}
}
push @store, [ $line, \%data ];
}
else {
for (@store) { print $_->[0] }
@store = ( [ $line, \%data ] );
$query = $data{query};
}
}
for (@store) { print $_->[0] }