2015-11-30 2 views
0

Я новичок в создании сценариев, и я пытаюсь объединить несколько файлов, пути которых перечислены в текстовом файле и выводятся комбинированный файл gzip. , например, файл списка - File_list.txt содержит эти файловые путиОбъединить несколько файлов, перечисленных в текстовом файле, используя perl Script

/data/path/file1.txt 
data2/path2/file2.txt 
....file3.txt 
....file4.txt 

Пока мой код для всех файлов, перечисленных в локальном каталоге (выводит только объединенный файл не архивированная):

#!/usr/bin/perl 

use strict; 
use File::Slurp; 

my $directory = 'Users/xyz/Documents/'; 

opendir(dir, $directory) or die $!; 
my @files = readdir(dir); 
closedir dir; 

my $outfilename = 'Combined.fastq' 

my $outfilesrc = undef; 

foreach (sort @files){ 
    $outfilesrc.= File::Slurp::slurp("$basedir/$_"); 
} 

open(OUT, "> $basedir/$outfilename") or die ("Can't open for writing: 
    $basedir/$outfilename : $!"); 
print OUT $outfilesrc; 
close OUT; 

exit; 

Может кто-нибудь, пожалуйста, поделитесь, как читать файлы, используя этот список, а не одну директорию? Я знаю, что это намного проще в простой bash, но я пытаюсь создать модуль для конвейера, так что это нужно в Perl. Спасибо!

+0

Попробуйте прочитать список в массиве '@ files'. См. [Правильный способ чтения файла данных в массив] (http://stackoverflow.com/questions/8963400/the-correct-way-to-read-a-data-file-into-an-array) –

+2

*** «Я знаю, что это намного проще в простой bash» *** Это справедливо только тогда, когда «простой bash» - это единственный язык, который вам хорошо известен – Borodin

+0

@Borodin На самом деле вам не нужно «хорошо знать» bash scripting: cat \ 'cat file_list \' >> new_file проще, чем этот скрипт perl – ChatterOne

ответ

3

Вы ничего не делаете с zip-файлом. Я даже не могу угадать (Archive::Zip довольно неплохо).

Для конкатенации нескольких файлов вы можете использовать дескриптор файла ARGV или <>.

#!/usr/bin/env perl 
use strict; 
use warnings; 

open (my $combined, '>', 'combined.fastq') or die $!; 

select $combined; 
print while <>; 

close $combined; 

Если сделать трюк - вы открываете выходной файл, выберите его в качестве места по умолчанию для печати, а затем распечатать каждую строку захваченной в <> - который все данные в любых файлах, указанные в командной строке, или данные по каналам.

Таким образом, вызывая этот скрипт как merge.pl *.txt, он принимает все текстовые файлы (в текущем каталоге) и объединяет их в объединенный файл.

Как вы получили список ввода - это так просто, как:

open (my $list_of_files, '<', 'file_list.txt') or die; 
chomp (@ARGV = <$list_of_files>); 
close ($list_of_files); 

Это будет достичь того же результата в целом.

+0

Большое спасибо за ответ. Да, я не знал, что мне нужно будет применить этот скрипт к большому набору файлов, а затем закрепить их в конце. Кроме того, мне, возможно, придется использовать этот скрипт и в zip-файлах, поэтому я думаю об использовании zcat для этого. Будет ли это рекомендуемым способом? – AnkP

+0

zcat предназначен для файлов gzipped. Вы не можете использовать zcat для zip-файлов. 'Архив :: Zip' не для gzipped-файлов. Посмотрите на 'IO :: Compress :: Gzip' и' IO :: Uncompress :: Gunzip' для gzip. Ищите пример здесь: http://unix.stackexchange.com/questions/48690/whats-the-difference-between-gunzip-and-unzip – bolav

+0

Извините за свою ошибку, я использую его для нескольких gzip-файлов, которые были бы в GBs, и поскольку это огромные файлы, мне нужно сохранить значение scape/time. – AnkP

0

Большое спасибо за ваши ответы. Скрипт работает хорошо сейчас, будучи новым в perl, он казался мне трудным. Просто отправьте мой код ниже -

#!/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("cat $data_file >> $out"); 
} 
my $outzip = "./test.gz"; 
gzip $out => $outzip; 
Смежные вопросы