2017-01-24 3 views
0

Я хочу к добавить код в следующем сценарии для устранения этих пустых выходных файлов.устранить пустые файлы в подпрограмме в Perl

Сценарий преобразовать один файл fastq или все файлы fastq в папке в Fasta формате, все выходные FASTA файлы сохраняют такое же имя файла fastq; сценарий представляет собой возможность исключить все последовательности, которые представляют собой определенное количество NNN повторяет (NNNNNNNNNNNNNNNNNNATAGTGAAGAATGCGACGTACAGGATCATCTA), я добавил эту опцию, потому что некоторые последовательности представляют только NNNNN в последовательности, например: если опция -n равна 15 (-n 15) он исключает все последовательности, которые содержат 15 повторов N повторений, к этому моменту код работает хорошо, но он генерирует пустые файлы (в тех файлах fastq, которые исключены из всех последовательностей, содержащих 15 или более N повторов). Я хочу удалить все пустые файлы (без последовательностей) и добавить количество файлов, которые были удалены, потому что они были пустыми.

Код:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Getopt::Long; 

my ($infile, $file_name, $file_format, $N_repeat, $help, $help_descp, 
    $options, $options_descrp, $nofile, $new_file, $count); 

my $fastq_extension = "\\.fastq"; 

GetOptions (
    'in=s'  => \$infile, 
    'N|n=i'  =>\$N_repeat, 
    'h|help' =>\$help, 
    'op'  =>\$options 
); 

# Help 

$help_descp =(qq(    
       Ussaje: 
       fastQF -in fastq_folder/ -n 15 
         or 
       fastQF -in file.fastq -n 15 
      )); 

$options_descrp =(qq(

      -in  infile.fastq or fastq_folder/     required 
      -n  exclude sequences with more than N repeat  optional 
      -h  Help description        optional 
      -op  option section         optional 
        )); 

$nofile =(qq(
      ERROR: "No File or Folder Were Chosen !" 

       Usage: 
        fastQF -in folder/ 

       Or See -help or -op section 
      )); 

# Check Files 

    if ($help){ 
     print "$help_descp\n"; 
     exit; 
    } 
    elsif ($options){ 
     print "$options_descrp\n"; 
     exit; 
    } 

    elsif (!$infile){ 
     print "$nofile\n"; 
     exit; 
    } 


#Subroutine to convert from fastq to fasta 

    sub fastq_fasta { 

     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>) 
     ) { 
       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){ 
         next; 
        } 
        else{ 
         print OUTFILE $head, $seq; 
        } 
       } 
     } 

     close OUTFILE; 
     close LINE; 
    } 

# execute the subrutine to extract the sequences 

    if (-f $infile) {   # -f es para folder !! 
     fastq_fasta($infile); 
    } 
    else { 
     foreach my $file (glob("$infile/*.fastq")) { 
     fastq_fasta($file); 
     } 
    } 

exit; 

Я пытался использовать следующий код вне подпрограммы (до выхода), но это просто работа для последнего файла:

$new_file =$file_name.".fasta"; 
     foreach ($new_file){ 

      if (-z $new_file){ 
       $count++; 
       if ($count==1){ 
        print "\n\"The choosen File present not sequences\"\n"; 
        print " \"or was excluded due to -n $N_repeat\"\n\n"; 

       } 
       elsif ($count >=1){ 
        print "\n\"$count Files present not sequences\"\n"; 
        print " \" or were excluded due to -n $N_repeat\"\n\n"; 

       } 

       unlink $new_file; 
      } 
     } 

и я просто попытался что-то подобное внутри подпрограммы, но этот последний код не работает !!!!

Любой Посоветуйте !!!! ???

Большое спасибо !!!

+4

Ваш цикл Еогеасп выполняется только один раз, потому что $ new_file одно значение скалярной, а не список значений. – toolic

ответ

0

вы должны проверить, если что-то было написано в ваш новый файл в конце нашей подпрограммы 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 заявления также другой UNLINK линии. Пустые файлы должны быть удалены.

Может быть другое решение, если вы не крепились к Perl, но разрешается использовать СЕПГ и Баш цикл:

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 

Надежда, что помогает!

Лучший Франк

+0

спасибо огромное! –

0

Проще всего сделать это, вероятно, чтобы добавить счетчик к вашей подпрограмме, чтобы следить за количество последовательностей в OUTFILE:

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; 
} 

Вы можете удалить файлы, когда возвращаются число равно нулю:

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; 
     } 
    } 
} 
+0

большое спасибо! –