Ok, that changes things somewhat. How about this:
#!/usr/bin/perl
use warnings;
use strict;
my $str1 = <<STR;
col1 col2 col3
1 4 7
2 5 8
3 6 9
STR
my $str2 = <<STR;
col1 col2 col3
1 44 77
2 55 88
3 66 99
STR
open my $fIn, '<', \$str1;
my $index = 0;
my %fileCols = map{+"file1 $_" => $index++} split /\s+/, <$fIn>;
my @file1Data;
push @file1Data, [split /\s+/] while <$fIn>;
close $fIn;
my @wantedCols = ('col1', 'col3', 'file1 col3');
open $fIn, '<', \$str2;
$index = @{$file1Data[0]};
$fileCols{$_} = $index++ for split /\s+/, <$fIn>;
my @slice = map{exists $fileCols{$_} ? $fileCols{$_} : ()} @wantedCols
+;
print join(' ', map{(split /\s+/)[-1]} @wantedCols), "\n";
while (<$fIn>) {
chomp;
print join (' ', (@{$file1Data[$. - 2]}, split /\s+/)[@slice]), "\
+n";
}
Prints:
col1 col3 col3
1 77 7
2 88 8
3 99 9
Note that effectively all of the first file is read into memory to avoid having to re-read and parse it for each following file. This is fine so long as the first file is less than about half the memory you have available.
Perl is the programming world's equivalent of English
|