Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Double Sort on a file

by rchou2 (Novice)
on Jul 22, 2002 at 22:05 UTC ( #184251=perlquestion: print w/replies, xml ) Need Help??

rchou2 has asked for the wisdom of the Perl Monks concerning the following question:

I was wondering how I would do a double sort on a file with 6 columns, where the sorting is based on the 5th and 6th columns. Column five is numeric and column six is a string. Previously, I did a single sort with my @args = qw/ sort -n -r -k 5 filein -o fileout

Replies are listed 'Best First'.
Re: Double Sort on a file
by PhiRatE (Monk) on Jul 22, 2002 at 22:13 UTC
    sort can take multiple -k arguments. Try sort -n -r -k 5 -r -k 6 filein -o fileout (I seem to recall thats how it works, a quick test seems to agree).

    Of course, there is a time in every datas life when it should really be loaded into a database instead..

Re: Double Sort on a file
by rbc (Curate) on Jul 22, 2002 at 22:09 UTC
      I believe that actually merges the two columns as a single key, as opposed to using two keys (at least, thats the impression I get from the somewhat ambiguous man page). Thus, it would work fine if the two keys are next to each other (as they are in this case) and both strings. But for a numeric sort on column 1 and a string sort on column 2, you need to specify the keys independantly (-n -k 1 -k 2).
Double Sort Rephrased
by rchou2 (Novice) on Jul 22, 2002 at 22:37 UTC
    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

      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?

      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


      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..)
      Gnu sort's index starts with 0. The last column would be "2" not "3". Does this help, rchou2?

        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

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://184251]
Approved by markmoon
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2023-09-24 17:26 GMT
Find Nodes?
    Voting Booth?

    No recent polls found