我正在尝试设计一个Perl脚本,以便在比较不同序列时找到同一列中找到的最高氨基酸数。
每个序列都已在自己的行或字符串中找到。
格式示例:序列1,2和3.
KPKFYALDMFPYPSGAGLHVGHPEGYTATDIVARYKRMTGHN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPSQTTVKN------------------VGRFREQLQSLGFSY-D-WDREVATCDA
KPKCYILDMFPYPSGAGLHVGHPLGYTATDILSRFKRMKGFN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPKITTERN------------------IERFRTQLKSLGFSY-D-WDREISTTEP
KPKCYILDMFPYPSGAGLHVGHPLGYTATDILSRFKRMQGFN-----------VLHPMGW---DAFGLPA
EQYA ------ IQTGTHPKFTTAQN ------------------ IDRFRTQLKSLGFSY-d-WDREISTTEP
我希望输出是每个序列中发现的最高氨基酸K
及其出现的次数(对于第一个氨基酸),然后进入下一个氨基酸。序列(P
)直到$end amount
。
到目前为止,这是我写的。任何有关如何使其更清晰或更有效的帮助都是可以做到的。
我在计算部分时遇到问题,并且在下一次计数时移到下一列。
#! /usr/bin/perl -w
use strict;
use warnings;
#use diagnostics;
open(S, "Leu Mito Align.txt") || die "cannot open FASTA file to read: $!";
open(OUTPUT, ">output.txt");
my @lines = <S>;
my $lines;
my @seq;
my $seq;
my $line;
my $count;
my $start = 140; # amino acid column start
my $end = 150; # amino acid column end
my $final = 150; # end of count
my $column;
my @extract;
my $extract;
my $aa = 0; # get the first amino acid, should increment by one until it reaches end of string, which should be $ae.
my $ae = 1;
my @count;
foreach $seq (@seq) { #original sequence
$seq =~ s/^>.*]//g;
$column = substr($seq, $start, $end); # selects amino acid sequence from $start to $end
@extract = "$column\n"; # Sequence length
#print OUTPUT @extract;
for $extract (@extract) {
#print OUTPUT $extract;
$count = substr($extract, $aa, $ae); # Count amino acids individually one by one until it reaches ae.
#print $count;
@count = "$count\n";
@count = (split /\s/, $count);
这是我陷入困境的部分。我尝试创建哈希以计算不同的字母,但没有运气。
while (@count) {
foreach $AA (@count) {
$AA++ foreach ($_);
}
}
答案 0 :(得分:0)
这是对你需要的猜测。您只给出了两个序列作为样本数据,因此为每列选择“多数”是没有意义的。 (在任何一点上,都有两个相同的酸,其数量为2,或两个不同的酸,每个的计数为1.因此,永远不会有多数。)。另外,你没有说明如何处理序列字符串中的连字符。
该程序期望输入文件的路径作为命令行上的参数。
use strict;
use warnings;
my @counts;
while (<>) {
chomp;
my @acids = split //;
for my $i (0 .. $#acids) {
my $acid = $acids[$i];
++$counts[$i]{$acid};
}
}
my $max_seq = join '', map {
my ($chosen_acid, $max_count);
while (my ($acid, $count) = each %$_) {
unless ($max_count and $max_count < $count) {
$chosen_acid = $acid;
$max_count = $count;
}
}
$chosen_acid;
} @counts;
print $max_seq, "\n";
<强>输出强>
KPKCYILDMFPYPSGAGLHVGHPEGYTATDIVARYKRMKGHN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPKITTVKN------------------VERFREQLKSLGFSY-D-WDREVATCEP