2013-10-14 2 views
-1

входного файла:сортировки файлов на основе столбца в Perl

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

ли это быть сделано с Perl? Почему не команда 'sort'? – Barmar

+0

Как найти ключевое поле? Это всегда одна и та же позиция персонажа в строке? Пожалуйста, покажите, что вы пробовали до сих пор, мы не являемся услугой бесплатного кодирования. – Barmar

+0

Лучше сделать в linux – fugu

ответ

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

+1, но я думаю, что OP хочет сортировать по всему столбцу (т.е. '187-300'), а не' 187', в одиночестве. – Toto

+0

@ M42 OP упоминает '140 <184 <187', все числа перед тире, а результат выборки следует этой линии мысли? –

+0

Это не совсем понятно, он сказал также: «Мне нужно отсортировать все строки файла на основе столбца 187-300». – Toto

2

Это, безусловно, выход BLAST (или нечто подобное), который был проанализирован в этот формат. Возможно, вы можете использовать анализатор BLAST (например, в BioPerl) для управления вашими данными. Если все, что вы хотите, чтобы отсортировать 3-е поле в этом файле, хотя, что-то, как это должно работать (используя Unix-то, а не Perl):

sort -n -k 3.1,3.3 file > out 
1

Вы сортировкой на основе длины каждой строки?

В функции Perl's sort вы можете указать подпрограмму, которая обеспечивает основу вашей сортировки.

Perl передает подпрограмму два элемента данных, $a и $b. Они представляют два элемента в вашем массиве, который вы сортируете. Вы можете использовать любые ваши критерии, чтобы определить критерии сортировки, и пропустите назад -1 если $a должны быть отсортированы перед тем $b, а 0, если они равны, или 1 если $a должны быть отсортированы после $b.

Для функций можно использовать две функции: <=> для чисел и cmp, чтобы помочь создать правильное возвращаемое значение. Они автоматически возвращают -1, если аргумент слева меньше аргумента справа, 0, если оба они равны, и 1, если аргумент справа меньше аргумента слева.

Предполагая, что вы сортировкой на length строки:

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; 
} 
Смежные вопросы