求用perl或者python提取fasta格式中每个序列从一个位置到另一个位置的序列(每个序列位置都不一样) 30
谢谢你的回答,我还是不太会写!你比如说如下具体情况,fasta文件部分内容如下>bdi-miR168-5p-9870TCGCTTGGTGCAGATCGGGAC>osa-m...
谢谢你的回答,我还是不太会写!你比如说如下具体情况,fasta文件部分内容如下
>bdi-miR168-5p-9870
TCGCTTGGTGCAGATCGGGAC
>osa-miR166a-3p-9755
TCGGACCAGGCTTCATTCCCC
>tae-miR319-137
TTGGACTGAAGGGAGCTCCCT
>84-138
GCTCACTCCTCTTTCTGTCAGC
>42-139
ATTGAACTAAGGAGGGGTGGA
... ...
我要提取">" 后面的每一个标签下面序列,某个位置到某个位置的序列,如bdi-miR168-5p-9870 1 15 就是提取bdi-miR168-5p-9870第1个到第15个碱基序列.求脚本
bdi-miR168-5p-9870 1 15
osa-miR166a-3p-9755 2 23
tae-miR319-137 3 12
84-138 12 19
42-139 14 19
... ... 展开
>bdi-miR168-5p-9870
TCGCTTGGTGCAGATCGGGAC
>osa-miR166a-3p-9755
TCGGACCAGGCTTCATTCCCC
>tae-miR319-137
TTGGACTGAAGGGAGCTCCCT
>84-138
GCTCACTCCTCTTTCTGTCAGC
>42-139
ATTGAACTAAGGAGGGGTGGA
... ...
我要提取">" 后面的每一个标签下面序列,某个位置到某个位置的序列,如bdi-miR168-5p-9870 1 15 就是提取bdi-miR168-5p-9870第1个到第15个碱基序列.求脚本
bdi-miR168-5p-9870 1 15
osa-miR166a-3p-9755 2 23
tae-miR319-137 3 12
84-138 12 19
42-139 14 19
... ... 展开
展开全部
这个其实很简单,只是逻辑要通顺。
我给你perl的解决思路:
首先,你要确定你的fasta文件的内容的规律性。比如每段序列的开始是不是都会有一些特殊的标志。那么可以用next函数,将这些不是序列的内容跳过。
然后开始读取每一行,将每一行的内容串联起来,直到读取到下一段序列开始的标记
(该处使用if判断,如果读到标记就停止记录,可以有个好办法,你前期使用一个$num,前面读取的每行都串联给$seq,然后当你判断到标记符号出现以后,让$num++,并把$array[$num]=$seq,此处要注意一下,这里还要记得让$seq为空一下否则会出大问题的 ,然后就可以记录此条序列并进入下一条序列的读取了)
如此反复判断读取,最终可以将每个序列都读取出。
只要发现规律,有了思路,读取序列简直是分分钟的事情,思路以及发现规律性最为重要。
追问
谢谢你的回答,请看问题补充
追答
一样的道理:由于你这个规律性不大,而且你描述的后面要取的某一个区间的没有规律,不过我肯定的是,你的fasta序列肯定不大,否则你这样后面没有规律的乱取,简直是作死。
所以我的思路如下:
1.把所有的序列先取出来
2.按照你的区间段,把每条序列对应的部分取出来,主要用substr
#命令参数行:perl seq.pl 相对路径/fasta 相对路径/fasta 相对路径/outfile
use strict;
use warnings;
@ARGV == 3 or die "usage: $0<bam> <bed> <out>";
my ($inFile1, $inFile2, $outFile) = @ARGV;
open my $in1 ,'<',$inflie or die;
open my $in2 ,'<',$inflie or die;
open my $out ,'>',$outfile or die;
my $num = 0;
my $seq;
my @array;
while(<$in1>)
{
next if $. == 1; #第一行跳过,
$seq = .$_ ; #串联操作,将每一行串起来
if ($_=~/>/); #可能具体的正则表达式书写不正确
{
$array[$num]=$seq; #将得到的完整的seq给数组存储起来
$seq=''; #每次遇>这个符号,都让该变量为空一次
$num++;
}
}
#因为你要求的后面每段序列区间没有规律,所以其实我无法解决,如果有10万行记录,你这个没有规律的位置区间谁也解决不了该问题,我只能按照都是选择1.15之间的位置进行选择。没有规律的处理数据,谁写解决不了。
while(<$in2>)
{
foreach my $ss(@array)
{
my $new_seq = substr("$ss", 0,14);#取1-15这段子序列
print $out "$new_seq\n";
}
}
close $in1;
close $in2;
close $in3;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询