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

Dear Monks

I am trying to convert the table from one format to another format by adding some columns. For given account block, I have 2 columns 'Px and Qx'. I like to add 'Qy and Py'. P and Q makes a pair. and Px-Qx is sorted by column Px and Qx respectively. Qy-Py should be sorted by Qy and Py respectively. The data for Qy-Py is taken from Px-Qx without modification except changing the order within the account block.

Given

A  Px Qx
a1 p1 q5
a1 p1 q6
a1 p2 q4
a2 p3 q9
a2 p2 q8
a2 p2 q9
Should be converted to:
A  Px Qx  Qy Py
a1 p1 q5 q4 p2
a2 p1 q6 q5 p1
a1 p2 q4 q6 p1
a2 p3 q9 q8 p2
a2 p2 q8 q9 p3
a2 p2 q9 q9 p2

Thanks
artist

Replies are listed 'Best First'.
Re: Adding Columns from Given Data
by tedrek (Pilgrim) on Jun 26, 2003 at 22:07 UTC
    This gives the final result I think you want:
    my @oldlist = map {chomp; $_} <DATA>; my @sorted = map {$_->[2] . " " . $_->[1]} sort {($a->[2] cmp $b->[2]) || ($b->[1] cmp $a->[1])} map { [split] } @oldlist; my @newlist = map {shift(@oldlist) . ' ' . $_} @sorted; print join "\n", @newlist; __DATA__ a1 p1 q5 a1 p1 q6 a1 p2 q4 a2 p3 q9 a2 p2 q8 a2 p2 q9

    __OUTPUT__
    a1 p1 q5 q4 p2
    a1 p1 q6 q5 p1
    a1 p2 q4 q6 p1
    a2 p3 q9 q8 p2
    a2 p2 q8 q9 p3
    a2 p2 q9 q9 p2
    
    HTH

    Update: Forgot to mention my output is different from yours, I think it was a typo in your sample output, looking at your sample input.
      Thanks tedrek for the excellent code, I slightly modified because I like to 'sort' within account block
      my @oldlist = map {chomp; $_} <DATA>; my @sorted = map {$_->[2] . " " . $_->[1]} sort {($a->[0] cmp $b->[0]) || ($a->[2] cmp $b->[2]) || ($b->[1] cmp $a->[1])} map { [split] } @oldlist; #print join "\n", @sorted,"\n"; my @newlist = map {shift(@oldlist) . ' ' . $_} @sorted; print (join ("\t", split),"\n") for @newlist; __DATA__ a1 p1 qX5 a1 p1 q6 a1 p2 q4 a2 p3 q9 a2 p2 q8 a2 p2 q9 _OUTPUT__ a1 p1 qX5 q4 p2 a1 p1 q6 q6 p1 a1 p2 q4 qX5 p1 a2 p3 q9 q8 p2 a2 p2 q8 q9 p3 a2 p2 q9 q9 p2
      Notice that 'qX5' remains within the given block of account (a1).

      artist

Re: Adding Columns from Given Data
by shemp (Deacon) on Jun 26, 2003 at 21:54 UTC
    Could you give some more info about what you're trying to do. I think that this statement is the one that needs clarification:

    The data for Qy-Py is taken from Px-Qx without modification except changing the order within the account block.

    I dont see the correlation between Px-Qx and Qy-Py

    Also, how is this data stored, is it an array of hashrefs? Or a text file just like you have it shown? or something else?