首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从连接的fasta文件中,如何在每个蛋白质序列中找到各个位置的范围。

从连接的fasta文件中,如何在每个蛋白质序列中找到各个位置的范围。
EN

Stack Overflow用户
提问于 2016-08-18 19:40:40
回答 1查看 57关注 0票数 0

也许这个问题太笼统了,但我完全被困在了这个问题上。对任何类型的帮助都表示感谢:

我有一个蛋白质fasta文件(protein.txt),类似于:

代码语言:javascript
复制
>a
mnspq
>b
rstuvw
>c
mnqa

请注意,a、b和c蛋白的长度分别为5、6和4(总长度= 15)。

现在,我提取了一些随机范围(计算基于总长度),并将其保存为(file1.txt)如下:

代码语言:javascript
复制
2-3
4-10
11-14

在蛋白质文件中看到的每个蛋白质的长度(在总长度内)保存在另一个文件(file2.txt)中:

代码语言:javascript
复制
a  1-5
b  6-11
c  12-15

现在,从file1值中,我希望修改file2值,并尝试计算每个蛋白质序列的单个范围,对于上面的输入,输出将是:

代码语言:javascript
复制
a   2-3,4-5
b   1-5, 6
c   2-5

换句话说,如果我首先连接我的所有序列和去雷明的一些范围从级联文件,我如何才能找到在每个蛋白质序列的个别范围的位置。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-18 20:40:43

我想答案的最后一行应该是c 1-3

代码语言:javascript
复制
|---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到数组的范围读取。然后,从file2中读取蛋白质,对于与范围重叠的每个范围,计算和打印“开始”和“结束”。

代码语言:javascript
复制
#!/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";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39026294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档