0

任何人都可以帮我编写一个 Perl 脚本,该脚本可以将 5 个文本文件作为输入,并通过合并所有 5 个文件的每一行来创建一个新的文本文件。这应该通过一次打开 5 个读取流来完成,还是像 java 一样在 Perl 中提供一些随机文件阅读器?

谢谢你!

4

3 回答 3

7

这是一个可以处理任意数量文件的 Perl 脚本:

use strict;
use warnings;

my @files = ('a.txt','b.txt');
my @fh;

#create an array of open filehandles.
@fh = map { open my $f, $_ or die "Cant open $_:$!"; $f } @files;

open my $out_file, ">merged.txt" or die "can't open out_file: $!";

my $output;
do
{
    $output = '';

    foreach (@fh)
    {
        my $line = <$_>;
        if (defined $line)
        {
            #Special case: might not be a newline at the end of the file
            #add a newline if none is found.
            $line .= "\n" if ($line !~ /\n$/);
            $output .= $line;
        }
    }

    print {$out_file} $output;
}
while ($output ne '');

一个.txt:

foo1
foo2
foo3
foo4
foo5

b.txt:

bar1
bar2
bar3

合并的.txt:

foo1
bar1
foo2
bar2
foo3
bar3
foo4
foo5
于 2012-10-25T11:07:01.200 回答
5

该程序需要命令行上的文件列表(或者,在 Unix 系统上,通配符文件规范)。它为这些文件创建一个文件句柄数组,@fh然后依次从每个文件中读取,将合并的数据打印到STDOUT

use strict;
use warnings;

my @fh;
for (@ARGV) {
  open my $fh, '<', $_ or die "Unable to open '$_' for reading: $!";
  push @fh, $fh;
}

while (grep { not eof } @fh) {
  for my $fh (@fh) {
    if (defined(my $line = <$fh>)) {
      chomp $line;
      print "$line\n";
    }
  }
}
于 2012-10-25T11:23:22.927 回答
4

如果您可以使用非 perl 解决方案,则可以尝试以下操作:

paste -d"\n\n\n\n\n" f1 f2 f3 f4 f5

其中 f1,f2..是您的文本文件。

于 2012-10-25T10:38:13.273 回答