각 쿼리를 가져오고 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] }