Victor Ferreira
Victor Ferreira

Reputation: 3

How can I order a list by one of its sub elements in TCL

So I have a string that is treated as a list when I split them in the \n and it looks like this:
{aaaa2,bbbb2,cccccc,ddddd\n aaaa3,bbbb4,cccccc,ddddd\n aaaa4,bbbb1,cccccc,ddddd\n aaaa5,bbbb3,cccccc,ddddd}

I need to reorder this list based on B column, in a way that the lesser value comes first and equal values stay together. Meaning it should be something like this:
{aaaa4,bbbb1,cccccc,ddddd\n aaaa2,bbbb2,cccccc,ddddd\n aaaa5,bbbb3,cccccc,ddddd\n aaaa3,bbbb4,cccccc,ddddd}

How can I do it?

Upvotes: 0

Views: 199

Answers (1)

Shawn
Shawn

Reputation: 52344

If you split each element of your list into a list itself, you can use lsort's -index option:

set lst {aaaa2,bbbb2,cccccc,ddddd
    aaaa3,bbbb4,cccccc,ddddd
    aaaa4,bbbb1,cccccc,ddddd
    aaaa5,bbbb3,cccccc,ddddd}
set lst [lmap item $lst { split $item , }]
set lst [lsort -index 1 $lst]
puts [join [lmap sublist $lst { join $sublist , }] \n]

will output

aaaa4,bbbb1,cccccc,ddddd
aaaa2,bbbb2,cccccc,ddddd
aaaa5,bbbb3,cccccc,ddddd
aaaa3,bbbb4,cccccc,ddddd

Upvotes: 3

Related Questions