在perl中消除子例程中的空文件

在perl中消除子例程中的空文件,perl,bioinformatics,fasta,fastq,sequencing,Perl,Bioinformatics,Fasta,Fastq,Sequencing,我想在下一个脚本中添加一个代码,以消除这些空输出文件 脚本将单个fastq文件或文件夹中的所有fastq文件转换为fasta格式,所有输出的fasta文件保持fastq文件的相同名称;脚本提供了一个选项来排除所有呈现一定数量NNN重复的序列(nnnnnnnnnnnnnnnnnn atagtgaagaatgcgacgtacaggatcta),我添加了这个选项,因为有些序列在序列中仅呈现NNNNN,例如:如果-n选项等于15(-n 15)它将排除存在15个或更多N个重复的所有序列,到目前为止,代码运

我想在下一个脚本中添加一个代码,以消除这些空输出文件

脚本将单个fastq文件或文件夹中的所有fastq文件转换为fasta格式,所有输出的fasta文件保持fastq文件的相同名称;脚本提供了一个选项来排除所有呈现一定数量NNN重复的序列(nnnnnnnnnnnnnnnnnn atagtgaagaatgcgacgtacaggatcta),我添加了这个选项,因为有些序列在序列中仅呈现NNNNN,例如:如果-n选项等于15(-n 15)它将排除存在15个或更多N个重复的所有序列,到目前为止,代码运行良好,但它会生成一个空文件(在那些fastq文件中,所有存在15个或更多N个重复的序列都被排除)。我想消除所有的空文件(没有序列),并添加一个计数,计算由于文件为空而消除了多少个文件

代码:

我只是在子例程中尝试了一些类似的东西,但最后的代码不起作用

有什么建议吗


非常感谢

最简单的方法可能是在子程序中添加一个计数器,以跟踪输出文件中的序列数:

sub fastq_fasta {
    my $counter1 = 0;
    my $file = shift;
    ($file_name = $file) =~ s/(.*)$fastq_extension.*/$1/;

# eliminate old files 

    my $oldfiles= $file_name.".fasta";

    if ($oldfiles){
        unlink $oldfiles;
    }

    open LINE,    '<',   $file             or die "can't read or open $file\n";
    open OUTFILE, '>>', "$file_name.fasta" or die "can't write $file_name\n";

    while (
        defined(my $head    = <LINE>)       &&
        defined(my $seq     = <LINE>)       &&
        defined(my $qhead   = <LINE>)       &&
        defined(my $quality = <LINE>)
    ) {
            $counter1 ++;
            substr($head, 0, 1, '>');


            if (!$N_repeat){
                print OUTFILE $head, $seq;


            }

            elsif ($N_repeat){

                    my $number_n=$N_repeat-1;

                if ($seq=~ m/(n)\1{$number_n}/ig){
                    $counter1 --;
                    next;
                }
                else{
                    print OUTFILE $head, $seq;
                }
            }
    }

    close OUTFILE;
    close LINE;
    return $counter1;
}

您应该在我们的
fastq_fasta
子例程的末尾检查是否有东西写入了新文件。只需将代码放在
close OUTFILE
语句之后:

close OUTFILE;
close LINE;

my $outfile = $file_name.".fasta";
if (-z $outfile)
{
   unlink $outfile || die "Error while deleting '$outfile': $!";
}
此外,最好将
die/warn
语句也添加到另一个取消链接的行中。应删除空文件

如果您不固定使用perl,但允许使用sed和bash循环,则可能是另一种解决方案:

for i in *.fastq
do
   out=$(dirname "$i")/$(basename "$i" .fastq).fasta
   sed -n '1~4{s/^@/>/;N;p}' "$i" > "$out"
   if [ -z $out ]
   then
      echo "Empty output file $out"
      rm "$out"
   fi
done
希望有帮助

最佳弗兰克酒店

if (-f $infile) {           # -f es para folder !!
    fastq_fasta($infile);
}
else {
    foreach my $file (glob("$infile/*.fastq")) {
        if (fastq_fasta($file) == 0) { 
            $file =~ s/(.*)$fastq_extension.*/$1.fasta/;
            unlink $file; 
        }
    }
}
close OUTFILE;
close LINE;

my $outfile = $file_name.".fasta";
if (-z $outfile)
{
   unlink $outfile || die "Error while deleting '$outfile': $!";
}
for i in *.fastq
do
   out=$(dirname "$i")/$(basename "$i" .fastq).fasta
   sed -n '1~4{s/^@/>/;N;p}' "$i" > "$out"
   if [ -z $out ]
   then
      echo "Empty output file $out"
      rm "$out"
   fi
done