Как сделать так, чтобы функция сортировки работала хорошо в Perl? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 9 столбцов текстовых файлов.Я открываю и считываю его в массив

   #! /util/bin/perl
   use strict;
   use warnings;
   open (I,"Map.txt") || die "$!\n ";
   chomp (my $header =<I>);
   while (<I>){
   chomp(my $in=$_);
   my (@array) = split('\t',$in);
   $array[2] =~s/X/39/;

Мне нужно только извлечь 3 столбца и распечатать в порядке на 2 столбца.

   push my @entries, {
   CHR => $array[2],
   SNP => $array[1],
   GEN => '0',
   POS => $array[3],};


   my @sorted = sort {
   $a->{CHR} <=> $b->{CHR} ||
   $a->{POS} <=> $b->{POS} } @entries;

   foreach my $row (@sorted) {

  print $row->{CHR}, "\t" , $row->{SNP}, "\t" , $row->{GEN},"\t",$row->{POS}, "\n";}  

Я не уверен, почему моя функция сортировки можетне работа.Это потому, что что-то не так с push step?

Ввод:

 1  BICF2G630100019 1   31558578    0.8987  [A/G]   TOP BOT 1  
 2  BICF2G630100032 3   31570089    0.8963  [A/G]   TOP BOT 1  
 3  BICF2G630100034 2   31571436    0.9015  [A/G]   TOP TOP 1  
 4  BICF2G630100043 4   31596554    0.8337  [A/G]   TOP TOP 1  
 5  BICF2G630100054 1   31614639    0.9002  [T/C]   BOT BOT 1  
 6  BICF2G630100063 2   31625208    0.8962  [A/G]   TOP BOT 1  
 7  BICF2G630100075 3   31648688    0.8502  [A/C]   TOP BOT 1  

Ввод:

1   BICF2G630100019 0   31558578  
3   BICF2G630100032 0   31570089  
2   BICF2G630100034 0   31571436  
4   BICF2G630100043 0   31596554  
1   BICF2G630100054 0   31614639  
2   BICF2G630100063 0   31625208  
3   BICF2G630100075 0   31648688  

Требуется вывод:

1   31558578    0   BICF2G630100019  
1   31614639    0   BICF2G630100054  
2   31571436    0   BICF2G630100034  
2   31625208    0   BICF2G630100063  
3   31570089    0   BICF2G630100032  
3   31648688    0   BICF2G630100075  
4   31596554    0   BICF2G630100043  

1 Ответ

0 голосов
/ 20 ноября 2018

Я вижу как минимум две проблемы

  • push my @entries каждый раз переопределять записи?
  • ваша строка печати не соответствует желаемому выводу

Я взял ваш код и переписал его следующим образом (я заменяю TAB в ваших данных одним пробелом, чтобы убедиться, что он сохраняется при вставке на эту страницу):

#!/usr/bin/perl
use strict;
use warnings;

my @entries;
while (<DATA>) {
   chomp(my $in=$_);
   my @array = split(' ', $in);
   $array[2] =~s/X/39/;

   push(@entries, {
       CHR => $array[2],
       SNP => $array[1],
       GEN => '0',
       POS => $array[3],
   })
}

foreach my $row (@entries) {
    print join("\t", @{$row}{qw(CHR POS GEN SNP)}), "\n";
}
print "\n";

my @sorted = sort {
    $a->{CHR} <=> $b->{CHR} ||
    $a->{POS} <=> $b->{POS} }
    @entries;

foreach my $row (@sorted) {
    print join("\t", @{$row}{qw(CHR POS GEN SNP)}), "\n";
}

__DATA__
1 BICF2G630100019 1 31558578 0.8987 [A/G] TOP BOT 1
2 BICF2G630100032 3 31570089 0.8963 [A/G] TOP BOT 1
3 BICF2G630100034 2 31571436 0.9015 [A/G] TOP TOP 1
4 BICF2G630100043 4 31596554 0.8337 [A/G] TOP TOP 1
5 BICF2G630100054 1 31614639 0.9002 [T/C] BOT BOT 1
6 BICF2G630100063 2 31625208 0.8962 [A/G] TOP BOT 1
7 BICF2G630100075 3 31648688 0.8502 [A/C] TOP BOT 1

Вывод из моего теста:

1       31558578        0       BICF2G630100019
3       31570089        0       BICF2G630100032
2       31571436        0       BICF2G630100034
4       31596554        0       BICF2G630100043
1       31614639        0       BICF2G630100054
2       31625208        0       BICF2G630100063
3       31648688        0       BICF2G630100075

1       31558578        0       BICF2G630100019
1       31614639        0       BICF2G630100054
2       31571436        0       BICF2G630100034
2       31625208        0       BICF2G630100063
3       31570089        0       BICF2G630100032
3       31648688        0       BICF2G630100075
4       31596554        0       BICF2G630100043

Последний выглядит так, как вы хотели, правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...