-1

输入文件 :

gi|73912712|ref|NP_001027538.1| Cullin_binding  187-300 0.00e+00    2   EKLRNSLDYLRSVLN-DATSFKLIYRYAFDFAREKDQRSLDLNTAKCMLGLLLGKT-WPLFPVFNQFLEQSKYKVINKDQWCNVLEFSRTINLDLSNYDEDGAWPVLLDEFVEWYK    0.1 -   -
gi|189526861|ref|XP_001920428.1|    Pfam-B_8567 184-326 0.00e+00    27  EKKSSAQAAVEHSDRIFTELIRSLTKKRTEVRGEIRAQEKRETQQIIGYIQKREQEISNLQKRNDKLGQILCTEDYIHFFQNYSSHSTKIPYTLPKK--VHDDlVTFREVDQSVSELKRKLDEVCEEHMGKISKKVADVHIIQSA   0.1 -   -
gi|189526861|ref|XP_001920428.1|    zf-B_box    140-177 0.00e+00    2   QQQICPQHHKA-LEIYCYEDKRCICVLCLGQ-HRGHKTVS    0.1 -   -

我需要根据187-300列对整个文件行进行排序。

输出应按此列值的升序排列 (140<184<187) 所以,

gi|189526861|ref|XP_001920428.1|    zf-B_box    140-177 0.00e+00    2   QQQICPQHHKA-LEIYCYEDKRCICVLCLGQ-HRGHKTVS    0.1 -   -
gi|189526861|ref|XP_001920428.1|    Pfam-B_8567 184-326 0.00e+00    27  EKKSSAQAAVEHSDRIFTELIRSLTKKRTEVRGEIRAQEKRETQQIIGYIQKREQEISNLQKRNDKLGQILCTEDYIHFFQNYSSHSTKIPYTLPKK--VHDDlVTFREVDQSVSELKRKLDEVCEEHMGKISKKVADVHIIQSA   0.1 -   -
gi|73912712|ref|NP_001027538.1| Cullin_binding  187-300 0.00e+00    2   EKLRNSLDYLRSVLN-DATSFKLIYRYAFDFAREKDQRSLDLNTAKCMLGLLLGKT-WPLFPVFNQFLEQSKYKVINKDQWCNVLEFSRTINLDLSNYDEDGAWPVLLDEFVEWYK    0.1 -   -
4

3 回答 3

2

这显然是被解析成这种格式的 BLAST(或类似的东西)的输出。您可能可以使用 BLAST 解析器(如 BioPerl 中的解析器)来处理您的数据。如果您只想对这个文件中的第三个字段进行排序,那么这样的事情应该可以工作(使用 unix 排序,而不是 perl):

sort -n -k 3.1,3.3 file > out
于 2013-10-14T16:08:04.997 回答
1
perl -ane'
  push @r, [ $_, $F[2] =~ /(\d+)/ ];
  END {
    print $_->[0] for sort { $a->[1] <=> $b->[1] } @r;
  }
' file
于 2013-10-14T16:00:05.310 回答
1

您是否根据每行的长度进行排序?

在 Perl 的排序函数中,您可以指定一个子例程来提供排序的基础。

Perl 将两个数据项$a和传递给子例程$b。这些代表您正在排序的数组中的两个项目。您使用任何您的标准来确定排序标准,并传回一个-1if $ashould be sorted before $b、 a 0if they are equal 或 a 1if $ashould be sorted after $b

两个函数,用于数字的<=>和用于字符串的cmp可用于帮助创建正确的返回值。-1如果左边的参数小于右边的参数,0如果它们都相等,并且右边的参数小于左边的参数,它们会自动返回1

假设您正在对字符串的长度进行排序:

my @lines = <$fh>;
close $fh;
for my $line ( sort by_length @lines ) {
   print $line;
}

#
# Sort by length of the line
#
sub by_length {
    return length $a <=> length $b;
}
于 2013-10-14T16:16:22.560 回答