0

私の入力ファイルには、この方法で次の情報が含まれています

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

シーケンス (ID および length= の下のデータの文字列) は、次の正規表現の対象となります

 #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";
}

これは現在、単一のシーケンスのみを含むサンプル テキスト ファイルの結果をコマンド ラインに返します。

ファイル内にある次の要素と上記の正規表現を、テキスト ファイル内のシーケンスごとに 1 つのファイルに出力できるようにする必要があります (したがって、テキスト ファイル内にあるすべてのシーケンスに対して 1 つのファイル)。

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 に精通していないため、モジュールをダウンロードせずにエンド ユーザーができるだけ簡単に使用できるようにするためのものです)、および入力ファイルが本質的に非常に大きい (300MB 以上) ことです。 )。

この問題を処理する最善の方法は何でしょうか?

4

1 に答える 1

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";
  }
}
于 2013-02-27T03:23:51.707 に答える