【问题标题】:Concatenate multiple files listed in a text file using perl Script使用 perl 脚本连接文本文件中列出的多个文件
【发布时间】:2015-11-30 21:42:57
【问题描述】:

我是脚本新手,我正在尝试连接多个文件,这些文件的路径列出一个文本文件并输出一个组合的 gzip 文件。 例如列表文件 - File_list.txt 包含这些文件路径

/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 中需要它。 谢谢!

【问题讨论】:

  • 尝试将列表读入数组@files。见The correct way to read a data file into an array
  • “我知道使用简单的 bash 会容易得多” 只有当“简单 bash”是你唯一熟悉的语言时,这才是正确的
  • @Borodin 实际上你不需要“非常了解” bash 脚本:cat `cat file_list` >> new_file 比 perl 脚本简单
  • 好吧,除非你想正确处理边缘情况,因为那个例子会中断,例如带空格的文件名。
  • 是的,命令行/bash 对于文件数量有限的快速任务来说很容易。由于现在文件可以分散在整个目录中,并且来自不同的来源,我需要对其进行编码以避免任何可能的错误

标签: perl concatenation


【解决方案1】:

您似乎没有对 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; 

应该做到这一点 - 你打开一个输出文件,选择它作为默认打印位置,然后打印在&lt;&gt; 中捕获的每一行 - 这是命令行上指定的任何文件中的所有数据,或管道数据。

因此以merge.pl *.txt 调用此脚本将获取所有文本文件(在当前目录中)并将它们合并到组合文件中。

因为你有一个输入列表 - 这很简单:

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

这将总体上实现相同的结果。

【讨论】:

  • 非常感谢您的回复。是的,不知道我必须将此脚本应用于一堆大型文件,然后最后将它们压缩。另外,我可能也必须在 zip 文件上使用这个脚本,所以我正在考虑使用 zcat。这是推荐的方式吗?
  • zcat 用于压缩文件。您不能对压缩文件使用 zcat。 Archive::Zip 不适用于压缩文件。查看IO::Compress::GzipIO::Uncompress::Gunzip 获取gzip。在此处查找示例:unix.stackexchange.com/questions/48690/…
  • 对不起,这是我的错,我将它用于多个 gzip 压缩文件,这些文件将以 GB 为单位,由于这些文件很大,我也需要记住使用的 scape/time。
  • 不同的问题。值得单独询问 - 并解释您要完成的工作。
【解决方案2】:

非常感谢您的回复 - 脚本现在运行良好,对于 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多