http://qs321.pair.com?node_id=700566


in reply to Sort log file alphabetically

Read in all the records into an array of hashes. Then you can decide how to re-format/sort them them.

Here's a simple parser based on what your format seems to be:

my @list; while (<>) { chomp; my (%hash, @rest); ($hash{first}, $hash{date}, @rest) = split(",", $_); for my $r (@rest) { my ($k, $v) = split(' ', $r, 2); $hash{$k} = $v; } push(@list, \%hash); }
Now it doesn't matter what order the fields are in. To determine all the fields present in any of the records, you can use:
my %seen; for (@list) { for (keys %$_) { $seen{$_}++ } }; delete $seen{first}; delete $seen{date}; my @allkeys = ('first', 'date', sort keys %seen);
I'm just assuming that you want the first two fields to remain where they are. The rest will be sorted alphabetically.

Replies are listed 'Best First'.
Re^2: Sort log file alphabetically
by numberninja (Initiate) on Jul 28, 2008 at 19:24 UTC
    thanks, the problems been solved thanks to your help.
Re^2: Sort log file alphabetically
by numberninja (Initiate) on Jul 28, 2008 at 15:49 UTC
    thanks, the stuff u posted seems to work fine, as it prints out an alphabetized list of all the different names when i add a print command to the end. However, how would i tell perl to rearrange each line according to this order? especially since i need to make sure the correct data stays with the identifier
      You don't have to worry about the data staying with the identifier since that association is saved in the hash for the line.

      Re-formatting the lines is just looping over @list:

      my @keys = ...order you want the named keys in... for my $h (@list) { print join(",", $h->{first}, $h->{date}, map { $_." ".$h->{$_} } @keys), "\n"; }
        u were right about that, silly me and yet, now i have an incredibly trivial problem. For some reason, when i leave it as printing to the command window, it spews out the exact stuff that i want, yet when i tell it to print to a filehandle, the file is empty afterwards... here's my code:
        #! /usr/bin/perl print "File Location?"; my $data_file = <>; open(DATA, $data_file); my @list; while (<DATA>) { chomp; my (%hash, @rest); ($hash{first}, $hash{date}, @rest) = split(",", $_); for my $r (@rest) { my ($k, $v) = split(' ', $r, 2); $hash{$k} = $v; } push(@list, \%hash); }; my %seen; for (@list) { for (keys %$_) { $seen{$_}++ } }; delete $seen{first}; delete $seen{date}; my @allkeys = ('first', 'date', sort keys %seen); my @keys = (sort keys %seen); open(DATAOUT, ">1.temp"); while(<DATAOUT>) { for my $h (@list) { print DATAOUT join(",", $h->{first}, $h->{date}, map { $_." ".$h->{$_} } @keys), "\n"; } }