-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 のパーサーなど) を使用してデータを操作できます。ただし、このファイルの 3 番目のフィールドをソートすることだけが必要な場合は、次のように動作するはずです (perl ではなく unix ソートを使用):

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 のsort関数では、ソートの基礎となるサブルーチンを指定できます。

$aPerl はサブルーチンに と の 2 つのデータ項目を渡し$bます。これらは、並べ替えている配列内の 2 つの項目を表しています。ソート基準を決定するために基準が何であれ使用し、前にソートする必要がある場合、それらが等しい場合、または後にソートする必要がある-1場合を返します。$a$b01$a$b

数値用の<=>と文字列用のcmpの2 つの関数を使用して、正しい戻り値を作成できます。-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 に答える