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]