2015-12-01 2 views
-1

J'ai besoin d'écrire un script perl pour lire les fichiers gzippés à partir d'une liste de fichiers texte de leurs chemins, puis les concaténer ensemble et les sortir dans un nouveau fichier gzipé. (J'ai besoin de le faire en perl car il sera implémenté dans un pipeline) Je ne suis pas sûr de savoir comment accomplir la partie zcat et la concaténation, comme les tailles de fichier seraient en Gbs, je dois prendre soin du stockage et courir aussi bien.zcat pour lire les fichiers gzip puis les concaténer en Perl

Jusqu'à présent, je peux penser comme -

use strict; 
use warnings; 
use IO::Compress::Gzip qw(gzip $GzipError) ; 

#-------check the input file specified-------------# 

$num_args = $#ARGV + 1; 
if ($num_args != 1) { 
    print "\nUsage: name.pl Filelist.txt \n"; 
exit; 

$file_list = $ARGV[0]; 

#-------------Read the file into arrray-------------# 

my @fastqc_files; #Array that contains gzipped files 
use File::Slurp; 
my @fastqc_files = $file_list; 


#-------use the zcat over the array contents 
my $outputfile = "combined.txt" 
open(my $combined_file, '>', $outputfile) or die "Could not open file '$outputfile' $!"; 

for my $fastqc_file (@fastqc_files) { 

    open(IN, sprintf("zcat %s |", $fastqc_file)) 
     or die("Can't open pipe from command 'zcat $fastqc_file' : $!\n"); 
    while (<IN>) { 
     while (my $line = IN) { 
      print $outputfile $line ; 
     } 
    } 
    close(IN); 

my $Final_combied_zip = new IO::Compress::Gzip($combined_file); 
    or die "gzip failed: $GzipError\n"; 

Je suis en quelque sorte pas en mesure de le faire fonctionner. Aussi, si quelqu'un peut guider sur la bonne façon de sortir ce fichier compressé.

Merci!

+0

Avez-vous essayé 'zcat fichier1 fichier2 fichier3 ... filen | gzip> out.gz' (non testé)? –

+0

Avez-vous déjà essayé quelque chose? Parce que tenter de le faire va certainement donner de meilleures réponses. Il y a des modules pour le faire sans trop de difficulté. Ou il ya 'open' d'un tuyau exécutif – Sobrique

+0

@Sobrique J'ai essayé d'utiliser zcat pour lire le fichier gzip mais je ne suis pas sûr si je peux simplement concaténer avec chaque fichier gzip il lit dans la liste – AnkP

Répondre

1

Vous n'avez pas besoin de perl pour cela. Vous ne même pas besoin zcat/gzip sous forme de fichiers gzip sont cat en mesure:

cat $(cat pathfile) >resultfile 

Mais si vous avez vraiment vraiment besoin d'essayer d'obtenir la compression supplémentaire en combinant:

zcat $(cat pathfile)|gzip >resultfile 

Ajout: Notez également le premier lien « lié » à droite, qui semble répondre déjà cette même question: How to concat two or more gzip files/streams

+0

Ne serait pas les en-têtes et la bande-annonce (Checksum CRC32) se mélange si vous venez de chatter un tas de fichiers gzip dans un fichier gzip? Edit: Il le fera, mais gunzip sera toujours capable de décompresser le gros fichier gzip correctement. – gurka

+0

Pas selon le lien à la question liée: 'Le manuel de gzip indique que deux fichiers gzip peuvent être concaténés comme vous avez essayé.' http://www.gnu.org/software/gzip/manual/gzip.html# Advanced-usage –

+0

J'ai besoin de lire davantage le fichier combiné dans un programme qui traiterait le fichier zip combiné en un seul fichier, donc je ne peux pas concaténer les fichiers zip – AnkP

1

Merci pour les réponses - le script fonctionne bien maintenant -

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Slurp; 
use IO::Compress::Gzip qw(gzip $GzipError); 


my @data = read_file('./File_list.txt'); 
my $out = "./test.txt"; 


foreach my $data_file (@data) 

{ 
    chomp($data_file); 
    system("zcat $data_file >> $out"); 
} 
my $outzip = "./test.gz"; 
gzip $out => $outzip;