Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Feature request: two level sorting
- X-seq: zsh-users 21667
- From: Mikael Magnusson <mikachu@xxxxxxxxx>
- To: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- Subject: Re: Feature request: two level sorting
- Date: Wed, 15 Jun 2016 20:25:06 +0200
- Cc: Zsh Users <zsh-users@xxxxxxx>
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=noG5/6OeW+D5l6mz0rbKZAeGCV6JpjaQ8KazipvRnXA=; b=fSAamb5hpWjnnpo7W5xS3gd4NDUCBIJWGFAHIP90SseDxSb9COhGh5zaxlWE9dDDQV 894PZPJgi17GKS2KxVIGYLGQsj02ccbiK+OtPRmAdett4ykygmeSaNao+hpKmYUOn8Fw 6ZThQG7mLieUVbuV+w0OJ8hsm1JPNCOElxcZGu6q+cqrUI8JSx6gK+Asv8McXWcB2A03 WdhZgr+4ZtSG1OuuZvuAZeRf04lnAKVmKBdD1mPb3daSFSo4gkp388udgpAEbb3Baw5I BS7xgx6lsxBPcDJDLyY6XHQ7+aCZRoGAc9o4nc/XLoZbGfRwxEMm5VSybuSlBTNwRAHR 7tRA==
- In-reply-to: <160615101239.ZM21280@torch.brasslantern.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <CAKc7PVAsLwNVP0vjTvBebP5u+Ahe03yXaWxkvytOx4EPkN4V9Q@mail.gmail.com> <160615101239.ZM21280@torch.brasslantern.com>
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