Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Double Sort Rephrased

by rchou2 (Novice)
on Jul 22, 2002 at 22:37 UTC ( [id://184268]=note: print w/replies, xml ) Need Help??


in reply to Double Sort on a file

Thanks for the tips, but maybe this might help to get my idea through.

I have a list with three columns.

2 4 a ##end of row 1## 1 9 b ##end of row 2## 6 8 a ##end of row 3##
i want the sort to sort by string first and then reverse sort numerically to get the following do the following:
6 8 a ##end of row 1## 2 4 a ##end of row 2## 1 9 b ##end of row 3##
sorry for the confusion

Edit by dws to add <code> tags

Replies are listed 'Best First'.
Re: Double Sort Rephrased
by ignatz (Vicar) on Jul 22, 2002 at 23:35 UTC
    Funny, I've just been working on something similar to this.

    Your problem sounds perfect for the Sort::Fields module. It does reverse or numeric sorts on what ever columns you specify.

    ()-()
     \"/
      `                                                     
    
      I don't have the latest version of perl, is there any other way around this?
        Earlier than the module's required 5.003_03? Ouch! I don't think so. Time to take that washboard in for a new model.
        ()-()
         \"/
          `                                                     
        
Re: Double Sort Rephrased
by mkmcconn (Chaplain) on Jul 22, 2002 at 22:58 UTC

    You want to sort the whole row as a string, then sort on the first column numerically, correct?

    #!/usr/bin/perl -w use strict; my @sorted = map {$_->[0]} sort { $a->[0] cmp $b->[0] || $b->[1] <=> $a->[1] } map {[ $_ ,/(\w+)\s+(\w+)\s+(\w+)/]} <DATA> ; print for @sorted; __END__ 2 4 a 1 9 b 6 8 a

    UPDATED

    My mistake- I thought you were asking a perl perlfunc:sort question, rather than Gnu sort. (I also didn't realize that this was a mid-thread revision of the subj. line .). For a perl question, then you would be looking for...

    my @sorted = map {$_->[0]} sort { $a->[3] cmp $b->[3] || # sorted ascending alpha on col 3 $b->[2] <=> $a->[2] # then sorted reverse num on col 2 } map {[ $_ ,/(\w+)\s+(\w+)\s+(\w+)/]} <DATA> ; print for @sorted;

    (I think..)
    UPDATED2
    Gnu sort's index starts with 0. The last column would be "2" not "3". Does this help, rchou2?
    mkmcconn

      no, i have a file with the three columns, and i want to sort first based on the last column and then sort the second column numerically......and i need to sort the file....i tried using sort -k 3 -n -r -k 2 filein -o fileout but it didn' get the results i expected
        well, it is a perl question...i'm trying to modify the file through perl....

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (2)
As of 2024-04-20 12:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found