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

Re: Feature request: two level sorting



On Wed, Jun 15, 2016 at 7:12 PM, Bart Schaefer
<schaefer@xxxxxxxxxxxxxxxx> wrote:
> 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.

Can we do what the oe:: flag does for globbing? Ie, pass each element
to a custom code snippet that transforms it arbitrarily, and sort on
the output.

-- 
Mikael Magnusson



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