perl怎么从一个序列中截取不同位置的字符串,并保存成txt格式

文本名为1.txt,格式内容如下(>scaffold1为序列名):>scaffold1AACTTGGATTTGCAAACACAACATGCAACTGGAACACAGGAG... 文本名为1.txt,格式内容如下(>scaffold1为序列名):>scaffold1 AACTTGGATTTGCAAACACAACATGCAACTGGAACACAGGAGTGATGGTTGCTGATAGCGGGCCTCTGTACACCTATGTAGATATTACATTACAAATCAGCTGTTTCCAGCTACAATAGTCATTTACACTATTTACAATGTCTAAAATGTATTTCTGATCAATCTGATGTTATTTTATGGACAAAAAAAAAAGCTTTTCTTTTGAAAACATGGAATTTTCTATGTGACCCCAAACTTTTGAATATATGTGTATATGTTAAAATAAAATGTTAAAATATTCAAAATATTCAAGAACAATACTCTTTTTACAACATGTTTTGTTATTATTAAGTATGCTGCAAAGAGTTGTGGCGCCCCCCTTTTTTTCGACATACTACTTTTGACCGTCTCGGCCACCGTAGCCACTTTCCAAATAACAACATTAGGTGGCTGCTGTACTCAGTGAAACTCTTATCGGTGTGCGAGCTGCGGCTTGCCTCA怎样截取序列中1000-2000、3000-5000、6000-8000或更多片段的序列,然后保存成2.txt文本文件结果形式如下:第一行为序列名;第二行为序列>1000-2000AAAAATTTTT....>3000-5000AATTGGGCC.......也可以不要序列名,按顺序换行区分开就行

网友给出如下脚本,但是执行时出现了问题,怎么解决啊?
#!usr/bin/perluse warnings;use strict;my $testFile="D:/test/data/1.txt"; ###路径自己改下open IN,"<$testFile" or die ;my %data=( '10' => 20,#######改成你想要的 '30' => 50, );my $line=<IN>;chomp $line;$line=<IN>;$line=~s/\s//g;foreach my $key (keys %data){ my $answer=substr ($line,$key,$data{$key}); print ">$key-$data{$key}\n$answer\n";}
结果如下:
C:\Perl\bin>C:\Perl\bin\cut-seq.pl
substr outside of string at C:\Perl\bin\cut-seq.pl line 15, <IN> line 2.
Use of uninitialized value $answer in concatenation (.) or string at C:\Perl\bin
\cut-seq.pl line 16, <IN> line 2.
>120-130
展开
 我来答
76de1
2014-01-10 · TA获得超过1158个赞
知道小有建树答主
回答量:666
采纳率:100%
帮助的人:489万
展开全部
open F,"1.txt"; #画面上文件
open O,">2.txt"; #保存到2.txt
@array=<F>;
$count=0;
foreach (@array){
s/\s+//g;
if(/[A-Z]+/){@new=split(undef,$_);}
foreach (@new){ $count++; 
if($count>=10 and $count<=20){ push @new1, $_;}     #把10和20分别改成你要的范围,例如1000    2000,前提确保你的序列有那么长
if($count>=30 and $count<=50){ push @new2, $_;}     #把20和40分别改                  3000    5000
if($count>=60 and $count<=80){ push @new3, $_;}}    #把60和80分别改                   6000   8000
                 }
print O ">1000-2000\n";foreach(@new1){print O $_;} print O "\n";
print O ">3000-5000\n";foreach(@new2){print O $_;} print O "\n";
print O ">6000-8000\n";foreach(@new3){print O $_;}
追问
你忒强大了,佩服的五体投地!俺也想学,有没有perl教程或比较实用的联系可以推荐给给俺的?再次感谢!
追答
Sams teach yourself PERL in 24 hours
Beginning Perl for Bioinformatics
Beginning Perl(Wrox 2012)
Learning Perl 6th Edition
Programming Perl(4th)
Perl.5.By.Example
Perl Cookbook
基本上最有名的都在这里了,第一,第二本非常适合初学者。如果学习Perl是用来做生物的话,学习第二本就可以了。
越胖越能吃
2014-01-10 · 超过22用户采纳过TA的回答
知道答主
回答量:54
采纳率:0%
帮助的人:39.2万
展开全部
我帮你解释下问题, substr超出范围,就是说你截取的长度超出了实际值,标量$answer没有初始化,最后提醒下不要写-,是_。
追问
为什么会超出范围呢,我的序列有20M个左右的字符啊?perl零基础啊,求修改后的脚本。不胜感激!
追答
建议你先看下你的文件,你的文件是否是这样fasta文件,如果是里面是这样的结构,例如
>scaffold ad13124
ATCGTGTCGDTGCT....
>scaffold ad13125
TTTTCTCNATC...
.....
我给你的的代码只是处理你例举的文件形式,而不是对上面我例举的,请先看好文件,不然无法写你想要的东西~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月轮天唯五
2014-01-10 · TA获得超过377个赞
知道小有建树答主
回答量:387
采纳率:100%
帮助的人:158万
展开全部
你不会perl,perl很简单,找个人稍微指导下一周搞定。
$string=fsdfsadfsafsaf;
@ch10=$string=~/(\S{10})/g;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式