두 값을 확인하고 겹치는 경우 점수를 확인하고 다른 파일에 가장 높은 점수를 가진 값을 인쇄합니다.

두 값을 확인하고 겹치는 경우 점수를 확인하고 다른 파일에 가장 높은 점수를 가진 값을 인쇄합니다.

각 쿼리를 가져오고 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 사이입니다. Sr.no 3의 값은 Sr.no 2의 값 범위에 속하며 이는 중첩됩니다. 이 경우 코드는 점수를 확인하고 점수가 가장 높은 코드를 선택해야 합니다. 예상 출력에서 ​​볼 수 있듯이 Sr.no 2가 있는 행은 낮은 점수로 인해 제거되고 Sr.no 3이 있는 행은 높은 점수로 인해 선택됩니다.

답변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] }

관련 정보