Bryan Harris wrote: > > Yes, I learned about paste today, very handy. Unfortunately paste doesn't > always work right... > > t1 > 10 14 > 11 15 > 12 > 13 > > t2 > 20 26 > 21 27 > 22 > 23 > 24 > 25 > > % paste t* > 10 14 20 26 > 11 15 21 27 > 12 22 > 13 23 > 24 > 25
The reason paste doesn't work right and why it would be difficult to do the correct thing in perl is that the files switch from two columns to one column. > I would think the 22-25 should be lined up under the 21, but it doesn't do > it like that. Also, paste has a limit of 12 input files, and I can envision > cases where we'd need to "paste" ~100 single or double column files of > different lengths. Here is one way to do it: #!/usr/bin/perl use warnings; use strict; use Getopt::Std; use Tie::File; use POSIX qw(tmpnam); my $usage = <<USAGE; usage: $0 [-o outputfile] file1 file2 ... filen -o outputfile Print to outputfile instead of standard output -h Prints this message USAGE my %opts; getopts( 'ho:', \%opts ); die $usage if exists $opts{h}; die $usage unless @ARGV; my $file = exists $opts{o} ? $opts{o} : tmpnam(); tie my @output, 'Tie::File', $file or die "Cannot open $file: $!"; my ( $total, $gtotal ) = ( 0, 0 ); my @lines; while ( <> ) { next unless /\S/; my $count = ( my @fields = split ) + 1; $total = $count if $total < $count; push @lines, \@fields; if ( eof ) { for my $i ( 0 .. $#lines ) { $output[$i] .= "\t" x $gtotal unless defined $output[$i]; $output[$i] .= join( "\t", @{$lines[$i]} ) . "\t" x ($total - @{$lines[$i]}); } $gtotal += $total - 1; $total = 0; @lines = (); } } for ( @output ) { s/\t$//; print "$_\n" unless exists $opts{o}; } untie @output; unlink $file unless exists $opts{o}; __END__ John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]