Я пытаюсь улучшить программу perl, которую я ранее написал, чтобы она распознала верхнюю 1000-ю длину 23 k-mers, которая заканчивается GG, и распечатывать k-mers, которые только появляется один раз в последовательности. Однако независимо от того, где я добавляю reg exp, я не могу получить ожидаемый результат.Perl-программа для поиска k-mer с определенной последовательностью
код у меня есть:
#!/usr/bin/perl
use strict;
use warnings;
my $k = 23;
my $input = 'Fasta.fasta';
my $output = 'Fasta2.fasta';
my $match_count = 0;
#Open File
unless (open(FASTA, "<", $input)) {
die "Unable to open fasta file", $!;
}
#Unwraps the FASTA format file
$/ = ">";
#Separate header and sequence
#Remove spaces
unless (open(OUTPUT, ">", $output)) {
die "Unable to open file", $!;
}
<FASTA>; # discard 'first' 'empty' record
my %seen;
while (my $line = <FASTA>) {
chomp $line;
my ($header, @seq) = split(/\n/, $line);
my $sequence = join '', @seq;
for (length($sequence) >= $k) {
$sequence =~ m/([ACTG]{21}[G]{2})/g;
for my $i (0 .. length($sequence) - $k) {
my $kmer = substr($sequence, $i, $k);
##while ($kmer =~ m/([ACTG]{21}[G]{2})/g){
$match_count = $match_count + 1;
print OUTPUT ">crispr_$match_count", "\n", "$kmer", "\n" unless $seen{$kmer}++;
}
}
}
Входной файл FASTA выглядит следующим образом:
> >2L type=chromosome_arm; loc=2L:1..23011544; ID=2L; dbxref=REFSEQ:NT_033779,GB:AE014134; MD5=bfdfb99d39fa5174dae1e2ecd8a231cd; length=23011544; release=r5.54; species=Dmel;
CGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTGCCTCTCAT
TTTCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTAGT
GCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATGGTGGCGGA
TGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCA
TTGCAACGTTAAATACAGCACAATATATGATCGCGTATGCGAGAGTAGTG
CCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTATATTACCG
CAAACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAGCGGAGATATT
TAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGCCAACATAT
TGTGCTCTCTATATAATGACTGCCTCTCATTCTGTCTTATTTTACCGCAA
ACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTG
CCTCTCATTTTCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCG
AGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATG
GTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAA
TAAATTCATTGCAACGTTAAATACAGCACAATATATGATCGCGTATGCGA
GAGTAGTGCCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTA
TATTACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAGCG
GAGATATTTAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGC
CAACATATTGTGCTCTCTATATAATGACTGCCTCTCATTCTGTCTTATTT
TACCGCAAACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATAT
и так далее ...
ожидаемый результат (распечатать 23k- с окончанием GG, появляются только после в последовательности) Я надеюсь получить:
>crispr_1
GGGTGGAGCTCCCGAAATGCAGG
>crispr_2
TTAATAAATATTGACACAGCGGG
>crispr_3
ATCGTGGGGCGTTTTGTGAAAGG
>crispr_4
AGTTTTTCACATAATCAGACAGG
>crispr_5
GTGTTGGATGAGTGTCCTCTGGG
>crispr_6
ATAGGTTGGTTGTTTTAAAAGGG
>crispr_7
AAATTTTTGTTGCCACTGAATGG
>crispr_8
AAGTTTCGAACTACGATGGTTGG
>crispr_9
CATGCTTTGTGGAAATAAGTCGG
>crispr_10
CACAGTGGGTGTTTGCACCTCGG
.... and so on
Текущий код, который я сделал создать файл Fasta со следующим:
>crispr_1
CGACAATGCACGACAGAGGAAGC
>crispr_2
GACAATGCACGACAGAGGAAGCA
>crispr_3
ACAATGCACGACAGAGGAAGCAG
>crispr_4
CAATGCACGACAGAGGAAGCAGA
>crispr_5
AATGCACGACAGAGGAAGCAGAA
>crispr_6
ATGCACGACAGAGGAAGCAGAAC
>crispr_7
TGCACGACAGAGGAAGCAGAACA
>crispr_8
GCACGACAGAGGAAGCAGAACAG
>crispr_9
CACGACAGAGGAAGCAGAACAGA
>crispr_10
ACGACAGAGGAAGCAGAACAGAT
.... and so on
, а если я удалить
for (length($sequence) >=$k){
$sequence =~m/([ACTG]{21}[G]{2})/g;
и добавьте ## в то время как ($ kmer = ~ м/([АКТГ] {21} [G] {2})/г) {
while ($kmer =~ m/([ACTG]{21}[G]{2})/g){
Я получаю FASTA файл (с результатами, которые не пронумерованы правильно и unabl е различать дублированные и уникальные последовательности):
>crispr_1
CATTTTCTCTCCCATATTATAGG
>crispr_2
ATTTTCTCTCCCATATTATAGGG
>crispr_3
TATTGTGCTCTTTGATTTTTTGG
>crispr_4
GATTTTTTGGCAACCCAAAATGG
>crispr_5
TTTTTGGCAACCCAAAATGGTGG
>crispr_6
TTGGCAACCCAAAATGGTGGCGG
>crispr_7
ACGACAGAGAGAGAGAGCAGCGG
>crispr_8
AAATCGACAATGCACGACAGAGG
>crispr_91
TATTGTGATCTTCGATTTTTTGG
>crispr_93
TTTTTGGCAACCCAAAATGGAGG
.... and so on
Я попытался переместить регулярное выражение вокруг моего кода, но ни один из них не генерируются ожидаемый результат. Я не знаю, что я сделал не так. Я не добавляю выход программы, когда счетчик достигает 1000 в код.
Заранее благодарен!
Можете ли вы предоставить нам (вырезать при необходимости) ввод вместе с выводом, который вы хотите от этого входа. Очень сложно помочь, когда вы не видите данные, с которыми имеете дело. –
@DaveCross Я предоставил входной файл; это просто общий файл fasta, содержащий генетическую последовательность. Благодарю. – Kaiser
Я в замешательстве: первая ожидаемая строка (одна для 'crispr_1'):' CATTTTCTCTCCCATATTATAGG', но во входном файле, который вы показываете, нет последовательной последовательности. Как вы пришли к этой конкретной последовательности? –