Как найти количество и расположение двух подстрок в двух разных файлах? - PullRequest
1 голос
/ 03 февраля 2011

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

Например:

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

ПРИМЕЧАНИЕ: CAU->CAC не учитывается, поскольку его нет в следующем списке. СПИСОК: -> Также следует учитывать направление изменений.

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;

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011
#!/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";
    }
}
1 голос
/ 03 февраля 2011

Есть много способов сделать это, как это обычно бывает в Perl.

Если файл не большой, вы можете читать строку за строкой в ​​массив (или, если это уже одна запись в строке, просто отбросить весь файл в массив). Затем используйте цикл while (и дескриптор файла второго файла), чтобы сравнить положение динуклеотидов.

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

Для 3-символьного разбиения, которое вы пытаетесь сделать, я бы использовал цикл for, пока длина проверяемой строки не делится на 3 -1. Затем создайте регулярное выражение, взяв первые три буквы, затем следующую, и так далее ...

Что-то вроде /\d{$count}(\w{3})/

Цикл while может выглядеть примерно так:

#!/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 голосов
/ 03 февраля 2011

Можете ли вы считать, что кодоны в двух файлах "выровнены"? Если это так, проблема проста: вы загружаете список допустимых переходов в двухуровневый хэш:

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

ПРИМЕЧАНИЕ используйте 'exist () вместо define (), так как это сэкономит вам некоторые дополнительные вычисления. Если вы не хотите использовать функцию if (), вы можете вычислить $ codon1 и $ codon2, а затем проверить, существует ли (существует ($ transitions {$ codon1} {$ codon2})) {} Использование «Существует» позволяет избежать автовивификации. проблема ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...