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]