Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Sort log file alphabetically

by pc88mxer (Vicar)
on Jul 28, 2008 at 15:14 UTC ( #700566=note: print w/replies, xml ) Need Help??


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"; } }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://700566]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2023-03-24 20:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Which type of climate do you prefer to live in?






    Results (61 votes). Check out past polls.

    Notices?