基于perl中的列排序文件

时间:2013-10-14 15:50:00

标签: perl sorting

输入文件:

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 -   -

3 个答案:

答案 0 :(得分:2)

这显然是已经解析为此格式的BLAST(或类似的东西)的输出。您可以使用BLAST解析器(如BioPerl中的那些)来操纵您的数据。如果你想要的只是对这个文件中的第3个字段进行排序,那么这样的东西应该可行(使用unix排序,而不是perl):

sort -n -k 3.1,3.3 file > out

答案 1 :(得分:1)

perl -ane'
  push @r, [ $_, $F[2] =~ /(\d+)/ ];
  END {
    print $_->[0] for sort { $a->[1] <=> $b->[1] } @r;
  }
' file

答案 2 :(得分:1)

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

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

Perl将两个数据项$a$b传递给子例程。这些代表您正在排序的数组中的两个项目。您可以使用您的标准来确定排序条件,如果-1应在$a之前排序,则传回$b,如果0相等则为1,或者$a如果$b应在-1后排序。

两个函数,<=>用于数字,cmp用于字符串,可用于帮助创建正确的返回值。如果左边的参数小于右边的参数,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; } ,则自动返回{{1}}左边的论点。

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

{{1}}