2012-07-05 63 views
5

我有多个文本文件。我已经编写代码来通过shell输入2个文件并合并它们。但我如何合并多个文件。我的系统命令有用于此目的。perl代码合并多个文本文件

my @a = read_file($file1) 
    or die "couldn't read $file1 - $!"; 
my @b = read_file($file2) 
    or die "couldn't read $file2 - $!"; 

my $combined = {}; # hashref 

my $i=0; 
foreach (@a) { 
    chomp; 
    $combined->{$i}{b} = '' unless defined $combined->{$i}{b}; 
    $combined->{$i++}{a} = $_; 
} 

$i=0; 
foreach (@b) { 
    chomp; 
    $combined->{$i}{a} = '' unless defined $combined->{$i}{a}; 
    $combined->{$i++}{b} = $_; 
} 

foreach my $i (sort {$a<=>$b} keys %$combined) { 
    print $combined->{$i}{a}, ("\t" x 2), $combined->{$i}{b}, "\n"; 
} 

回答

4

据我了解,你可以看到在同一时间这两个文件的一行,并打印带有制表符分隔每一行,如:

use warnings; 
use strict; 

die unless @ARGV == 2; 

open my $fha, q|<|, $ARGV[0] or die; 
open my $fhb, q|<|, $ARGV[1] or die; 

while (my $a = <$fha>, my $b = <$fhb>) { 
    chomp($a, $b); 
    printf qq|%s\t\t%s\n|, $a, $b; 
} 

如果文件具有不同的该脚本将无法正常工作行数。对于这种情况,你需要另一种方法。

2

你可以这样做只是在外壳:cat file1.txt file2.txt file3.txt > selected.txt

或者在Perl:

use strict; 

@ARGV = ('file1.txt', 'file2.txt', 'file3.txt'); 

open MULTI, '>', 'selected.txt' 
    or die $!; 

while (<>) { 
    print MULTI; 
} 
+2

这不会以OP想要的方式合并文件,它会连接它们。 – TLP 2012-07-05 09:13:41

2

如何:

#!/usr/bin/perl 
use strict; 
use warnings; 

my @files = qw(file1 file2 file3 file4); 
my %content; 
my $max_rec = 0; 

foreach (@files) { 
    open my $fh, '<', $_ or die $!; 
    @{$content{$_}} = <$fh>; 
    chomp @{$content{$_}}; 
    close $fh; 
    $max_rec = @{$content{$_}} if scalar(@{$content{$_}}) > $max_rec; 
} 

open my $fh, '>', 'outfile' or die $!; 
for my $i (0 .. $max_rec) { 
    my $out = ''; 
    foreach (@files) { 
     $out .= defined($content{$_}[$i]) ? $content{$_}[$i] : ''; 
     $out .= "\t\t" unless $_ eq $files[-1]; 
    } 
    print $fh $out,"\n"; 
} 

输入文件:

$ cat file1 
1.1 
$ cat file2 
2.1 
2.2 
$ cat file3 
3.1 
3.2 
3.3 
$ cat file4 
4.1 
4.2 
4.3 
4.4 

输出文件:

$ cat outfile 
1.1  2.1  3.1  4.1 
     2.2  3.2  4.2 
       3.3  4.3 
         4.4 
0

这个脚本注重与IO高性能::文件,只有工作的文件至少在同一行上一些没有空白的文本。

#!/usr/bin/perl 
use IO::File; 
@f= map { IO::File->new($_) } @ARGV; 
print $q,qq(\n) until ($q=join (qq(\t), map { m{(.*)} && $1 } map { $_->getline } @f))=~m{^\t+$}