#!/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循环里面来,所以只可能是那一个判断的问题了。我假设你的“数字”都是按行存放的
我还假设你的“数字”和重叠不会发生结尾不足等问题
以上假设都是非常小的问题,可轻松解决,在此只为解释方法省去不必要的麻烦
程序接口等自己完成
打开文件有两种方法,一种在一开始全部打开,一种边输出边打开
本人能力有限,就简单化为第一种
前提,已知“数字”个数,即<输入文件>行数
可用shell, wc -l得到行数
my $line_number = 300
my $contig = 100
my $overlap = 20
my $nolap = $contig - $overlap
my $start = 0
my %hash
while (1)
{
my $name = "句柄名字"
$hash{$start} = $name
my $over = $start + $contig
open $name ">", $start ..$over " ...
$name = "新的句柄名字" # 自己想办法循环有效地转换句柄名称,可用正则等
$start = $start + $nolap # 开始位置改变
last, if ($over == $line_number)# 超过了就跳出
}
my $i # 计数器
my @print# 句柄数组
$start = 0
while ( <输入文件>)
{
my $line = $_
if ($i == $start)
{
push @print, $hash{$start}
$start = $nolap + $nolap
&printout(\@print, $line)
}
}
sub printout
{
my @print = @{$_[0]}
foreach (@print)
{
print {$_} $_[1]
}
}
以上,都是我自己现写的,没有测试的半伪代码,很有可能有致命错误,仅供参考
看到FASTA我就开心了,果然是搞生物的同行,互相学习了。
P.s 这样的程序你们的前辈应该有,管他们要吧,那些程序优化过,更成熟,如果得到了给我发一份学习下~谢while (<DATA>)
{
chomp
if (/(\d+) (\w+)$/ && allsame($1) && allsame($2))
{
my $c = substr($2, 0, 1)
$c = $c eq 'a'?'A':'U'
print "$_ $c\n"
}
}
sub allsame
{
my $c = substr($_[0], 0, 1)
return 1 if ($_[0] =~/^$c+$/ )
return 0
}
评论列表(0条)