+ -
当前位置:首页 → 问答吧 → perl第一列按照字符串比较大小,第二列按数字比较大小

perl第一列按照字符串比较大小,第二列按数字比较大小

时间:2011-09-12

来源:互联网

perl第一列按照字符串比较大小,第二列按数字比较大小.
例如
文件是这样的:
Scaffold009 3456 C T
Scaffold098 4567 T A
Scaffold009 1234 T G
Scaffold078 4356 G A
Scaffold078 3567 A G
Scaffold009 9876 T A
.....
.....

想得到的顺序是:
Scaffold009 1234 T G
Scaffold009 3456 C T
Scaffold009 9876 T A
Scaffold078 3567 A G
Scaffold078 4356 G A
Scaffold098 4567 T A
.....
.....

请高手赐教。小女子用的是
my @input=map{[$_,(split(/\t/))[1]]} <IN>;
my @sort=sort{ $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1]} @input;
my @input2=map {$_->[0]} @sort;
foreach (@input2)
{
  print OUT $_;
}
但是第二列它也按字符串的AsCII排大小,不知道怎样修改。
 

作者: yimocha   发布时间: 2011-09-12

请贴出测试用例,以及对应的输出。显然你这个文本里字符串序和数字序是一样的,反映不出你的问题。
另外你的代码不太好看,请注意空白的使用,以增加可读性。

作者: iambic   发布时间: 2011-09-12

map得到@input时,第一列是整个字符串,因为你使用了$_,不知这是否是你的原意?
所以sort时会先按照整个字符串排序,整个字符串相同时才会按照第二列排序(已经没什么意义了)。

作者: fanfan_im   发布时间: 2011-09-12

Perl code
#!/bin/perl 
use strict;

my @arr;
my %hash;

while(<DATA>){
    chomp;
    /(\w+\s\w+)\s(\w+\s\w+)/;
    $hash{$1}=$2;
}

foreach my $x (sort{$a cmp $b}keys %hash){
    print $x," ",$hash{$x},"\n";
}    

__DATA__
Scaffold009 3456 C T
Scaffold098 4567 T A
Scaffold009 1234 T G
Scaffold078 4356 G A
Scaffold078 3567 A G
Scaffold009 9876 T A

作者: imeuyniy   发布时间: 2011-09-13