in reply to Sample Sort Code

you can do this with a classical schwartzian transformation:
my @lines = split /\n/, <<EOD; D1001 SNAM1 1 101 XYZ1234 21.11 D1001 SNAM1 1 102 XYZ2234 22.12 D1002 SNAM2 1 201 PQR2234 12.12 D1002 SNAM2 2 202 PQR2234 32.12 D1002 SNAM2 3 203 PQR2234 52.12 D1002 SNAM2 4 204 PQR2234 37.12 D1001 SNAM1 2 103 XYZ1234 22.12 D1003 SNAM3 1 301 ABC1234 22.12 D1002 SNAM2 5 205 PQR2234 37.12 D1001 SNAM1 4 104 XYZ1234 22.12 EOD @lines = map { $_->[0] } # extract lines back out sort { # sort on split columns $a->[1][0] cmp $b->[1][0] # index 0 is 'col1' || $a->[1][1] cmp $b->[1][1] # col2 || $a->[1][4] cmp $b->[1][4] # col5 } map { [ $_ => [ split /\s+/, $_ ] ] } # [ 'line1' => ['col1', +...] ] @lines; print "$_\n" foreach @lines;
produces:
D1001     SNAM1        1     101      XYZ1234      21.11
D1001     SNAM1        2     103      XYZ1234      22.12
D1001     SNAM1        4     104      XYZ1234      22.12
D1001     SNAM1        1     102      XYZ2234      22.12
D1002     SNAM2        1     201      PQR2234      12.12
D1002     SNAM2        2     202      PQR2234      32.12
D1002     SNAM2        3     203      PQR2234      52.12
D1002     SNAM2        4     204      PQR2234      37.12
D1002     SNAM2        5     205      PQR2234      37.12
D1003     SNAM3        1     301      ABC1234      22.12

Replies are listed 'Best First'.
Re^2: Sample Sort Code
by johngg (Canon) on Sep 12, 2006 at 22:22 UTC
    I think that your first map and the subsequent sort in the ST look a little confusing. There is no need for an AoA as a simple anonymous list will suffice with no need for double subscripts in the sort block. Also, you can use split without arguments here as splitting $_ on whitespace is the default.

    use strict; use warnings; my $discard = scalar <DATA> for 1 .. 2; # Use the line below instead of above if # you want to retain the column headers. # # print scalar <DATA> for 1 .. 2; print map {$_->[0]} sort { $a->[1] cmp $b->[1] || $a->[2] cmp $b->[2] || $a->[5] cmp $b->[5] } map {[$_, split]} <DATA>; __END__ Col1 Col2 Col3 Col4 Col5 Col6 ======================================================== D1001 SNAM1 1 101 XYZ1234 21.11 D1001 SNAM1 1 102 XYZ2234 22.12 D1002 SNAM2 1 201 PQR2234 12.12 D1002 SNAM2 2 202 PQR2234 32.12 D1002 SNAM2 3 203 PQR2234 52.12 D1002 SNAM2 4 204 PQR2234 37.12 D1001 SNAM1 2 103 XYZ1234 22.12 D1003 SNAM3 1 301 ABC1234 22.12 D1002 SNAM2 5 205 PQR2234 37.12 D1001 SNAM1 4 104 XYZ1234 22.12

    Cheers,

    JohnGG

      excellent points.
Re^2: Sample Sort Code
by Anonymous Monk on Sep 13, 2006 at 17:08 UTC
    Hello everyone, Thanks for the reply. I think this option looks best for me, can you please tell me how to pass an input file instead of EOD, thanks
      open my $input, '<', 'myfile.txt' or die "cannot open myfile.txt: $!"; my @lines = <$input>;
      or, from command line args:
      my $filename = $ARGV[0] or die "Usage: $0 <filename>\n"; open my $input, '<', $filename or die "cannot open $filename: $!"; my @lines = <$input>;