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 展开
网友给出如下脚本,但是执行时出现了问题,怎么解决啊?
#!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 展开
3个回答
展开全部
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是用来做生物的话,学习第二本就可以了。
展开全部
我帮你解释下问题, substr超出范围,就是说你截取的长度超出了实际值,标量$answer没有初始化,最后提醒下不要写-,是_。
追问
为什么会超出范围呢,我的序列有20M个左右的字符啊?perl零基础啊,求修改后的脚本。不胜感激!
追答
建议你先看下你的文件,你的文件是否是这样fasta文件,如果是里面是这样的结构,例如
>scaffold ad13124
ATCGTGTCGDTGCT....
>scaffold ad13125
TTTTCTCNATC...
.....
我给你的的代码只是处理你例举的文件形式,而不是对上面我例举的,请先看好文件,不然无法写你想要的东西~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你不会perl,perl很简单,找个人稍微指导下一周搞定。
$string=fsdfsadfsafsaf;
@ch10=$string=~/(\S{10})/g;
$string=fsdfsadfsafsaf;
@ch10=$string=~/(\S{10})/g;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询