Проверьте два значения, если они перекрываются, проверьте их оценку и распечатайте то, которое имеет наивысшую оценку, в другом файле

У меня есть файл, из которого я должен брать каждый запрос и проверять значения 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 взят, так как он имеет более высокий балл

-2
29.08.2017, 11:24
1 ответ

Слегка протестированный 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] }
0
28.01.2020, 05:17

Теги

Похожие вопросы