2013-02-27 2 views
0

Моего входного файла содержит следующую информацию в этой манереРазбор больших текстовых файлов и подвергая извлеченную информацию в REGEX

>V063O:34:49 length=314 
GAGATGACTCCCAGGGGGGGGGGATGAAACCCAGACCTGGCACCATGGGATCAGCCATTC 
CATCTTGACCAAAGGGGGGGGGGAAAGAAAGTGTAATTAATAAAGTACAGTGGCAGAGAG 
AGTTCAAATAGTTGCGAGTCTACTCTGGAGGTTGCTGTTGTGCTAAGCTTCAGGTTATAC 
CTTGACCCTACCATACCCCCCAAACCAGGACAATTCCAAGCCCAAATCCGTAAAAGAAAC 
ACCTAAGGCAATATATAAGATTCTACAGGTCATACATCTAGACTACTTACTAACAATCCG 
TAACAACCTCAGAT 
>V063O:35:44 length=104 
GCTCTTTTTTTTTTTAGCAAAAACCGTTAGCCAATCCCTACCCAACCCCTGGCACCTGGG 
GGGGGGTGCCCGAGCGCCGGTGGGAGAACGGAGGAAACGCACTC 

Последовательность (строка данных ниже ID и длиной =) будет подвергнута следующим регулярным выражением

#Search sequence for a combination of 2 values of ACGT that are repeated at least 10 times 
     my $regex1 = qr/(([ACGT]{2}) \2{9,})/x; 
    #Search sequence for a combination of 3 values of ACGT that are repeated at least 7 times 
     my $regex2 = qr/(([ACGT]{3}) \2{6,})/x; 
    #Search sequence for a combination of 4 values of ACGT that are repeated at least 7 times 
     my $regex3 = qr/(([ACGT]{4}) \2{6,})/x; 
for my $regex ($regex1, $regex2, $regex3) { 
    next unless $seq1 =~ $regex; 
    printf "Matched %s exactly %d times\n", $2, length($1)/length($2); 
    printf "Length of sequence: $number \n"; 
} 

Это в настоящее время возвращает результаты из образца текстового файла, содержащего только одну последовательность в командной строке

мне нужно, чтобы иметь возможность напечатайте следующие элементы, найденные как внутри файла, так и с помощью регулярного выражения выше, до одного файла для каждой последовательности в текстовом файле (так что один файл для всех последовательностей, найденных в текстовом файле).

ID (example: V0630:34:49) , The elements that are repeating (example; GCT), the number of repeats (example; 13), and the length of the entire sequence. 

условия является то, что BioPerl не вариант (пользователь не Perl-здравый смысл, так что это предназначается, чтобы быть легким для конечного пользователя, как это возможно, без необходимости загружать модули) и что входные файлы очень большой по характеру (300 МБ или более).

Что было бы лучшим способом справиться с этой проблемой?

+0

Эй, откуда вы взяли этот геном? Он выглядит подозрительно, как мой :-) – paxdiablo

+0

Пользователь не Perl-savvy, поэтому вы даете пользователю регулярные выражения? лол. –

+0

Ну, я надеюсь, что конечный пользователь просто укажет на входной файл и запустит скрипт без участия. Это должно быть интересно. – Citizin

ответ

0

Из ваших комментариев, похоже, это может быть домашнее задание. Вы хотите решить эту проблему самостоятельно?

use strict; 
use warnings; 
use autodie; 

my @regexes = (
    qr/(([ACGT]{2}) \2{9,})/x, 
    qr/(([ACGT]{3}) \2{6,})/x, 
    qr/(([ACGT]{4}) \2{6,})/x, 
); 

open my $fh, '<', 'data.txt'; 

my $seq; 
my $id; 

while (<$fh>) { 

    if (/^>(\S+)/) { 
    process_sequence($id, $seq) if $seq; 
    $id = $1; 
    $seq = '' 
    } 
    else { 
    chomp; 
    $seq .= $_; 
    } 
} 
process_sequence($id, $seq) if $seq; 

sub process_sequence { 
    my ($id, $seq) = @_; 
    for my $regex (@regexes) { 
     next unless $seq =~ $regex; 
     printf "Sequence ID %s matched %s exactly %d times\n", $id, $2, length($1)/length($2); 
     printf "Length of sequence: %s \n", length $seq; 
     print "\n"; 
    } 
} 
+0

Это проект, но нам предлагается искать помощь как внутри нашего класса, так и из внешних источников. Мы на самом деле не слишком много покрывали и еще не касались условностей, циклов, хэшей (например, if (/ ^> (\ S +) /) - мы даже не смотрели на это!) Я полностью понимаю ваши беспокойство. – Citizin

+0

ОК. Вы довольны этим ответом? – Borodin

+0

Регулярное выражение '/ ^> (\ S +) /' проверяет, начинается ли строка с помощью прямоугольной скобки, за которой следует несколько непространственных символов, и, если это так, захватывает эти непространственные символы и делает их доступными как ' $ 1'. – Borodin

Смежные вопросы