简单问题请教:perl读取序列,给每个序列加上序列名称(即编号)然后写入新文件。

AGCCCTCTGTAGCATTTGTATGGCAGCCCTCTGTAGTATTTCTATGGCAGCCCTCTGTAGTATTTGTATGGCTCCTTAGAC...为... AGCCCTCTGTAGCATTTGTATGGC
AGCCCTCTGTAGTATTTCTATGGC
AGCCCTCTGTAGTATTTGTATGGCTCCTTAGAC
...

为什么我的程序(见下面)运行后只生成一行>Leaf_1呢?请高手点拨一下循环哪里错了? 谢谢!

#!/usr/bin/perl -w
die "perl $0 <Input txt>\n" unless(@ARGV == 1);
open IN,$ARGV[0];
open OUT,">Output.fa";
my $count = 1;
while(<IN>){
if($_) {
print ">Leaf_$count\n";
print OUT ">Leaf_$count\n";
$count++;
}
}
close IN;
close OUT;
展开
 我来答
laohu2862
2013-05-16 · TA获得超过1246个赞
知道小有建树答主
回答量:557
采纳率:0%
帮助的人:643万
展开全部
#!/usr/bin/perl -w
die "perl $0 <Input txt>\n" unless(@ARGV == 1);
open IN,$ARGV[0];
open OUT,">Output.fa";
my $count = 1;
while(<IN>){
if($_) { #这个判断存在问题
print ">Leaf_$count\n";
print OUT ">Leaf_$count\n";
$count++;
}
}
close IN;
close OUT;

将if($_) 这个去掉再试试吧。
或者将这一句修改为 if($_=~/[ATCG]/gi)也可以
因为看你说的输出结果,文件句柄应该是打开了的,否则执行不到wile循环里面来,所以只可能是那一个判断的问题了。
更多追问追答
追问
谢谢您的回答。两种方法我都试了,但结果都还是只输出第一行就停止了,并未执行while循环。看来问题还没有找到。
追答
那你的文本文件里面能否确认没有00这样的非标准二进制字符?
建议将
if($_) {
print ">Leaf_$count\n";
print OUT ">Leaf_$count\n";
$count++;
}
这一段先修改一下,修改为:
print “$_";
看看打印的信息是什么,如果打印没有问题,那么在while之前加上$/="\n";试试
如果不能打印出信息,那么可能就是你的文件里面存在了空字符,就需要你新建一个文本文件或者将你现在的文本文件另存为一个ANSI编码的文本,注意是ANSI,也就是你另存为的时候可以看到,编码一行显示ANSI,不要是unicode或者其他的。
然后你再运行你的脚本试试。
百度网友c9e795dda
2013-05-16 · TA获得超过5167个赞
知道大有可为答主
回答量:1128
采纳率:0%
帮助的人:1137万
展开全部
估计是你的输入路径有错.

将这句 open IN,$ARGV[0];
改成 open IN,$ARGV[0] or die "$! $ARGV[0]";

看看会不会报错
追问
还有一种思路:我的原始文件是tab-delimited格式的:
AAGACCATTCGAGCTTATCTCTTC 1 1
ATGGAGAAGGAAATGAAGAGCAGT 1 1
......

如果用程序从上面文件里直接提取第一列(序列)数据,然后按顺序加上序列名>seq_1,2,3...是不是可以避免后续可能产生的格式困扰呢?如果可行,能帮忙写一个这样的程序吗?谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式