Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Feature request: two level sorting



On Jun 15,  7:13am, Sebastian Gniazdowski wrote:
}
} # print -rl -- ${(o)files[@]}
} aaa-A
} aab-B
} aac-A
} aad-C
} 
} when sorted with grouping on A, this will be:
} 
} aaa-A
} aac-A
} aab-B
} aad-C

In a follow-on message you compare this to SQL GROUP BY, but you're
conveniently ignoring that GROUP BY works on rows of data in columms
whereas here you're asking for something that works on arrays of
strings.

"Feature request: A one-line parameter expansion that converts an
array to a two-dimensional array by parsing with a pattern match,
sorts the 2d array on one axis using multiple values of the other
axis, and then reassembles the original one-dimensional array
elements again in the new ordering."

Can you even suggest a syntax for this that wouldn't look worse than
the "for" loop you already wrote?
 
} **The thing is** that it is easy to provide group names in separate
} array:
} 
} # groups=( "${files[@]//(#b)*([A-Z])/$match[1]}" )

OK, let's examine that for a second.  What can't easily be done in the
general case might be easily done in the specific.  Can you choose a
delimiter of some kind that will never appear in $match[1] ?  Let's
try ":" for this example.

    groups=( "${files[@]//(#b)*([A-Z])(#m)/${match[1]}:$MATCH}" )

Now:

    print -rl -- "${(@)${(@o)groups}#*:}"

And there you go.  It can even be written without the extra array:

print -rl -- "${(@)${(@o)${files[@]//(#b)*([A-Z])(#m)/${match[1]}:$MATCH}}#*:}"

But it would be horrible to try to make a generic sorting flag that
can be passed the pattern plus the fields on which to group plus the
sort order to apply to the result.



Messages sorted by: Reverse Date, Date, Thread, Author