如何使排序功能在Perl中正常工作?

时间:2018-11-20 07:33:06

标签: arrays perl sorting

我有9列txt文件。我打开并将其读入数组

   #! /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";}  

我不确定为什么我的排序功能无法正常工作。是因为推送步骤出现问题吗?

输入:

 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 :(得分:7)

我至少看到两个问题

  • 1 evet_att1:3;event_att2:2 2 event_att3:1 每次都重新定义条目吗?
  • 您的打印行与您期望的输出不符

我接受了您的代码并按如下方式重写了代码(我将数据中的TAB替换为一个空格,以确保它在插入到此页面后不会丢失):

push my @entries

我的测试运行输出:

#!/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

后者看起来像您想要的,对吗?