使用perl脚本连接文本文件中列出的多个文件

时间:2015-11-30 21:42:58

标签: perl concatenation

我是脚本新手,我正在尝试连接多个文件,其路径列为文本文件并输出组合的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中使用它。 谢谢!

2 个答案:

答案 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;