Path: ...!feed.opticnetworks.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Janis Papanagnou Newsgroups: comp.unix.shell Subject: Re: Numerically sorted arguments (in shell) Date: Sun, 16 Jun 2024 11:48:25 +0200 Organization: A noiseless patient Spider Lines: 64 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Injection-Date: Sun, 16 Jun 2024 11:48:27 +0200 (CEST) Injection-Info: dont-email.me; posting-host="567efb17d94aca7729125b64ceeb67a7"; logging-data="9519"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19zrxlMHKl3wMzW+1NqrAIT" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 Cancel-Lock: sha1:FGfcXVq6mfC3aFolY6KhHqWDRoA= X-Enigmail-Draft-Status: N1110 In-Reply-To: Bytes: 3293 On 16.06.2024 06:56, Lawrence D'Oliveiro wrote: > On Sun, 16 Jun 2024 05:11:29 +0200, Janis Papanagnou wrote: > >> I don't know of this feature in Perl or Python; please provide some hint >> if there is a feature like the one I need. Some code samples for >> demonstration of your point are also welcome. > > Python solution: > > import re > > items = \ > [ > "P1.HTM", "P10.HTM", "P11.HTM", "P2.HTM", "P3.HTM", > "P4.HTM", "P5.HTM", "P6.HTM", "P7.HTM", "P8.HTM", "P9.HTM", > ] > > print(items) > > print \ > ( > sorted > ( > items, > key = lambda f : > tuple > ( > (lambda : p, lambda : int(p))[i % 2 != 0]() > for i, p in enumerate(re.split("([0-9]+)", f)) > ) > ) > ) > > output: > > ['P1.HTM', 'P10.HTM', 'P11.HTM', 'P2.HTM', 'P3.HTM', 'P4.HTM', 'P5.HTM', 'P6.HTM', 'P7.HTM', 'P8.HTM', 'P9.HTM'] > ['P1.HTM', 'P2.HTM', 'P3.HTM', 'P4.HTM', 'P5.HTM', 'P6.HTM', 'P7.HTM', 'P8.HTM', 'P9.HTM', 'P10.HTM', 'P11.HTM'] > Thanks. Though I'm not familiar with Python to understand that code; it's too far from any language I've been using. The (for me) interesting question, though, is; how does it solve the task I had been addressing? - For convenience I reiterate one main application... I want from my shell command line interface call a viewer (or any other application) with a list of files. If in shell I do, e.g., viewer P*.HTM the list gets sorted lexicographically. How would the main function look like that I could embed in my call to make a numerically sorted list. Say, something like, for example, viewer $( p_sort P*.HTM ) where p_sort would be the Python code. - Note: this is no appropriate solution since it would anyway not work correctly for file names with embedded blanks and newlines. I just want to get a closer understanding how you think this would be usable in shell (or from shell). Thanks. Janis