2011-02-03 7 views
1

与えられた2つの配列から、私は3つのコドンごとにチェックする必要があり、変更が次のリストのものと同じであれば、変更の場所と変更されたコドンをチェックして、出現回数を数えなければなりません。2つの異なるファイルで2つの部分文字列の数と位置を調べるにはどうすればよいですか?

例えば:それは、以下のリストにありませんのでCAU->CACを考慮していない:

sequence 1 - TTCAUUUCCCAU 
sequence 2 - TTTAUAUCGCAC 

私が取得する必要があり、出力は

TTC->TTT considered/location-1/count-1 
AUU->AUA considered/location-2/count-1 
UCC->UCG considered/location-3/count-1 

NOTEです。 LIST: - >変更の方向も考慮する必要があります。

first sequence->second sequence 
TTC->TTT 
CTG->UUA 
AUU->AUA 
GUG->GUA 
UCC->UCG 
CCC->CCG 
ACC->ACG 
GCC->GCG 
UAC->UAU 
UGA->UAG 
CAC->CAU 
CAG->CAA 
AAC->AAU 
AAG->AAA 
GAC->GAU 
GAG->GAA 
UGC->UGU 
CGG->CGU 
AGC->AGU 
AGG->CGU 
AGA->CGU 
UAA->UAG 
GGC->GGU 

私が今まで書かれているコードは次のとおりです。

print "Enter the sequence:"; 
$a = <>; 

print "Enter the mutated sequence:"; 
$b = <>; 

chomp($a); 
chomp($b); 

my @codon = split(/(\w{3})/, $a); 
my @codon1 = split(/(\w{3})/, $b); 

open(OUT, ">output.txt") or die; 
$count = 0; 
@new =(); 
@new1 =(); 
for ($i = 0; $i <= $#codon; $i++) { 
    for ($j = 0; $j <= $#codon1; $j++) { 
     if ($codon[$i] = {TTC}) || ($codon1[$j] = {TTT}) { 
      $count++; 
     } 
    } 
} 
print OUT " @new"; 
close OUT; 

答えて

2
#!/usr/bin/env perl 
use strict; 

my %seq_map = (
    "TTC"=>"TTT", 
    "CTG"=>"UUA", 
    "AUU"=>"AUA", 
    "GUG"=>"GUA", 
    "UCC"=>"UCG", 
    "CCC"=>"CCG", 
    "ACC"=>"ACG", 
    "GCC"=>"GCG", 
    "UAC"=>"UAU", 
    "UGA"=>"UAG", 
    "CAC"=>"CAU", 
    "CAG"=>"CAA", 
    "AAC"=>"AAU", 
    "AAG"=>"AAA", 
    "GAC"=>"GAU", 
    "GAG"=>"GAA", 
    "UGC"=>"UGU", 
    "CGG"=>"CGU", 
    "AGC"=>"AGU", 
    "AGG"=>"CGU", 
    "AGA"=>"CGU", 
    "UAA"=>"UAG", 
    "GGC"=>"GGU" 
); 

my %seq_count =(); 

my $seq1 = "TTCAUUUCCCAU"; 
my $seq2 = "TTTAUAUCGCAC"; 

my $max = int(length($seq1)/3); 
for(my $i=0;$i<$max;$i++) { 
    my $c1 = substr($seq1, $i*3, 3); 
    my $c2 = substr($seq2, $i*3, 3); 
    my $found = $seq_map{$c1}; 
    if ($found && ($found eq $c2)) { 
     $seq_count{$c1} ||= 0; 
     my $count = ++$seq_count{$c1}; 
     my $loc = $i+1; 
     print "${c1}->${c2} considered/location ${loc}/count ${count}\n"; 
    } 
} 
:あなたはその次、との最初の3つの文字を、つかむために行くよう whileループはこのような何かを見ることができる

何か

/\d{$count}(\w{3})/のように続いて...正規表現を作成します

+0

しかし、私の出力は1000です... nimは上記のプログラムを処理できません。 – Jamis

+0

より長い配列にはどんな問題がありますか?文字列をコードに入れるのではなく、ファイルを読み込むだけですか? – pyvi

1

場合はPerlで一般的であるとして、これを達成する多くの方法があります。

ファイルが大きければ、ファイルを行単位で読み込むことができます(または、ファイルが行ごとに1つのエントリになっている場合は、ファイル全体を配列にスラップしてください)。次に、whileループ(および2番目のファイルのファイルハンドル)を使用して、ジヌクレオチドの位置を比較します。

これはバイオインフォマティクスの問題であり、ファイルが一般的に大きいため、私はスマートになり、各ファイルハンドルから行ごとに比較を行います。

あなたがしようとしている3文字の分割について、私はforループを使用して、チェックしている文字列の長さが3 -1で割られるまで行っています。

#!/usr/bin/perl -w 
use strict; 

open FILE1, "file1.txt" or die "Cannot open file1.txt: $!\n"; 
open FILE2, "file2.txt" or die "Cannot open file2.txt: $!\n"; 

my $count = 0; 
while (<FILE1>) { 
    chomp(my $lineF1 = $_); 
    chomp(my $lineF2 = <FILE2>); 

    # some changes may need to be made to this if statement 
    if ($lineF1 eq $lineF2) { 
     # do something important here 
     print "$lineF1\n"; 
    } else { 
     print "Line $count mismatch\n"; 
    } 
    $count++; 
} 

close(FILE1); 
close(FILE2); 
0

2つのファイルのコドンが「整列」していると考えることができますか?そのような場合、問題は単純です:あなたは、2レベルのハッシュに有効な遷移のリストを読み込む:(?または、彼らはただ1つの文字列です)

# of course, you load this from a file... 
$transitions{TTC}{TTT} = 1; 
$transitions{CTG}{UUA} = 1; 
... 

その後、両方のファイル、行ずつ読んで:それはあなたにいくつかの余分な計算を節約するよう

# of course, I'm leaving out all the file manipulation... 
my $line1 = <FILE1>; 
my $line2 = <FILE2>; 

my $maxlen1 = length($line1); 
my $maxlen2 = length($line2); 
my $i = 0; 

while($i < $maxlen1 && $i < $maxlen2){ 
    my $codon1 = substr($line1, $i, $i+3); 
    if(exists($transitions{$codon1}){ 
    my $codon2 = substr($line2, $i, $i+3); 
    if(exists($transitions{$codon1}{$codon2}){ 
     print "we have a match $codon1 -> $codon2 at index $i\n"; 
    } 
    } 
    $i += 3; 
} 

NOTE使用は「()の代わりに、定義された()が存在します。 next()をしたくない場合は、$ codon1と$ codon2を計算し、if(exists($ transition){$ codon1} {$ codon2})){}を使うと '問題...

関連する問題