David wrote:
> 
> Joseph Paish wrote:
> 
> > i have a data file that looks something like this :
> > ( it is already sorted by date )
> >
> > 12/22/02 abc 123 456 789
> > 12/23/02 def 246 812 98234
> > 12/24/02 ank 987 23456 8762
> > 12/27/02 abc 987 345 65434
> > 01/05/03 abc 876 2356 87
> > 01/09/03 ank 875 234 98098
> > 02/01/03 def 987 3453 456
> > 02/05/03 ghi.th 987 2345 94
> >
> > what i have done so far :
> >      sort data file by the second field
> >      while (not end of file) {
> >           read each record and store it in a temporary array
> >           keep reading until the second field changes
> >           if the second field changes {
> >                write the temporary array to the output file
> >                store the "just read" record in the temporary array
> >           }
> >      }
> >
> >
> > this seems needlessly complicated.  there has to be a better way.
> > suggestions?
> >
> 
> if the file is already sorted, using a hash will do the trick:
> 
> #!/usr/bin/perl -w
> use strict;
> 
> my %hash;
> 
> open(DATA,"sorted_file.txt") || die $!;
> $hash{(split)[1]} = $_ while(<DATA>);
> close(DATA);
> 
> print for(values %hash);
> 
> __END__
> 
> prints:
> 
> 02/05/03 ghi.th 987 2345 94
> 02/01/03 def 987 3453 456
> 01/05/03 abc 876 2356 87
> 01/09/03 ank 875 234 98098
> 
> the disadvantage is that the output is bit out of order.

With just a little extra code you can get the correct output order:

#!/usr/bin/perl -w
use strict;

my %hash;
my $index = 'aaaaaa';

open DATA, 'sorted_file.txt' or die "Cannot open 'sorted_file.txt' $!";
$hash{ (split)[1] } = $index++ . "\0$_" while <DATA>;
close DATA;

print for grep s/^\w+\0//, sort values %hash;

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to