我是脚本新手,我正在尝试连接多个文件,其路径列为文本文件并输出组合的gzip文件。 例如列表文件 - File_list.txt包含这些文件路径
/data/path/file1.txt
data2/path2/file2.txt
....file3.txt
....file4.txt
到目前为止,我的代码是针对本地目录中列出的所有文件(仅输出组合文件而不是gzip):
#!/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 :(得分: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 );
这将总体上完成相同的结果。
答案 1 :(得分: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;