从串联的 fasta 文件中,如何找到每个蛋白质序列中的各个位置范围
From the concatenated fasta file, how to find individual range of locations in each protein sequence
可能这个问题太笼统了,但我完全卡在了这里。感谢任何类型的帮助:
我有一个蛋白质 fasta 文件 (protein.txt),例如:
>a
mnspq
>b
rstuvw
>c
mnqa
注意a,b,c蛋白的长度分别是5,6和4(总长度=15)
现在我提取了一些随机范围(计算是基于总长度)并将其保存(file1.txt)为:
2-3
4-10
11-14
在蛋白质文件中看到的每个蛋白质的长度(在总长度内)保存在另一个文件中(file2.txt)为:
a 1-5
b 6-11
c 12-15
现在从 file1 值,我想修改 file2 值并尝试计算每个蛋白质序列的单独范围,对于上述输入,输出将是:
a 2-3,4-5
b 1-5, 6
c 2-5
换句话说,如果我首先连接我的所有序列并从连接的文件中提取一些范围,我如何才能在每个蛋白质序列中找到单独的位置范围
谢谢
我猜答案的最后一行应该是c 1-3
:
|---a---| |---b-----| |--c--|
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|-| |-----------| |-----|
1 2 3 4 5 1 2 3 4 5 6 1 2 3 4
Perl 助你一臂之力!首先,file1 的范围被读入一个数组。然后,从文件 2 中读取蛋白质,并且对于与该范围重叠的每个范围,计算并打印 "start" 和 "end"。
#!/usr/bin/perl
use warnings;
use strict;
my @ranges;
open my $f1, '<', 'file1.txt' or die $!;
while (<$f1>) {
chomp;
push @ranges, [ split /-/ ];
}
open my $f2, '<', 'file2.txt' or die $!;
while (<$f2>) {
my ($protein, $range) = split;
print "$protein";
my $separator = ' ';
my ($from, $to) = split /-/, $range;
shift @ranges while @ranges && $ranges[0][1] < $from;
last unless @ranges;
while (@ranges && $ranges[0][0] <= $to) {
my $start = $ranges[0][0];
$start = $from if $from > $start;
my $end = $ranges[0][1];
$end = $to if $end > $to;
$_ -= $from - 1 for $start, $end;
print $separator, $start == $end ? $start : "$start-$end";
$separator = ',';
if ($ranges[0][1] < $to) {
shift @ranges;
} else {
$ranges[0][0] = $to + 1;
}
}
print "\n";
}
可能这个问题太笼统了,但我完全卡在了这里。感谢任何类型的帮助:
我有一个蛋白质 fasta 文件 (protein.txt),例如:
>a
mnspq
>b
rstuvw
>c
mnqa
注意a,b,c蛋白的长度分别是5,6和4(总长度=15)
现在我提取了一些随机范围(计算是基于总长度)并将其保存(file1.txt)为:
2-3
4-10
11-14
在蛋白质文件中看到的每个蛋白质的长度(在总长度内)保存在另一个文件中(file2.txt)为:
a 1-5
b 6-11
c 12-15
现在从 file1 值,我想修改 file2 值并尝试计算每个蛋白质序列的单独范围,对于上述输入,输出将是:
a 2-3,4-5
b 1-5, 6
c 2-5
换句话说,如果我首先连接我的所有序列并从连接的文件中提取一些范围,我如何才能在每个蛋白质序列中找到单独的位置范围
谢谢
我猜答案的最后一行应该是c 1-3
:
|---a---| |---b-----| |--c--|
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|-| |-----------| |-----|
1 2 3 4 5 1 2 3 4 5 6 1 2 3 4
Perl 助你一臂之力!首先,file1 的范围被读入一个数组。然后,从文件 2 中读取蛋白质,并且对于与该范围重叠的每个范围,计算并打印 "start" 和 "end"。
#!/usr/bin/perl
use warnings;
use strict;
my @ranges;
open my $f1, '<', 'file1.txt' or die $!;
while (<$f1>) {
chomp;
push @ranges, [ split /-/ ];
}
open my $f2, '<', 'file2.txt' or die $!;
while (<$f2>) {
my ($protein, $range) = split;
print "$protein";
my $separator = ' ';
my ($from, $to) = split /-/, $range;
shift @ranges while @ranges && $ranges[0][1] < $from;
last unless @ranges;
while (@ranges && $ranges[0][0] <= $to) {
my $start = $ranges[0][0];
$start = $from if $from > $start;
my $end = $ranges[0][1];
$end = $to if $end > $to;
$_ -= $from - 1 for $start, $end;
print $separator, $start == $end ? $start : "$start-$end";
$separator = ',';
if ($ranges[0][1] < $to) {
shift @ranges;
} else {
$ranges[0][0] = $to + 1;
}
}
print "\n";
}