誰かが5つのテキストファイルを入力として受け取り、5つのファイルすべての各行をマージして新しいテキストファイルを作成できるPerlスクリプトの作成を手伝ってくれませんか。これは、一度に5つの読み取りストリームを開くか、Javaのように、Perlでランダムなファイルリーダーを使用できるようにすることで実行する必要がありますか?
ありがとう!
以下は、任意の数のファイルで動作する 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 '');
a.txt:
foo1
foo2
foo3
foo4
foo5
b.txt:
bar1
bar2
bar3
merged.txt:
foo1
bar1
foo2
bar2
foo3
bar3
foo4
foo5
このプログラムは、コマンド ライン (または、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";
}
}
}
Perl 以外のソリューションで問題ない場合は、これを試すことができます。
paste -d"\n\n\n\n\n" f1 f2 f3 f4 f5
ここで、f1、f2 .. はテキスト ファイルです。