输入文件:
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 - -
答案 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}}