How to sort strings that contain a common prefix and suffix numerically from Bash?
Solution 1
Use ls -lv
From the man page:
-v natural sort of (version) numbers within text
Solution 2
Try the following:
sort -t '_' -k 2n
-
-t '_'
(sets the delimiter to the underscore character) -
-k 2n
(sorts by the second column using numeric ordering)
DEMO.
Solution 3
If available, simply use sort -V
. This is a sort for version numbers, but works well as a "natural sort" option.
$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
Without sort:
$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
With sort -V:
$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
Solution 4
In the general case, try the Schwartzian transform.
Briefly, break out the number into its own field, sort on that, and discard the added field.
# In many shells, use ctrl-v tab to insert a literal tab after the first \2
sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2 \1\2/' file |
sort -n |
cut -f2-
This works nicely if the input doesn't have an obvious separator, like for the following input.
abc1
abc10
abc2
where you would like the sort to move the last line up right after the first.
AWE
Updated on February 20, 2020Comments
-
AWE over 4 years
Here is a list of files:
some.string_100_with_numbers.in-it.txt some.string_101_with_numbers.in-it.txt some.string_102_with_numbers.in-it.txt some.string_23_with_numbers.in-it.txt some.string_24_with_numbers.in-it.txt some.string_25_with_numbers.in-it.txt
Now I would like to sort it numerically. Starting with *23* and ending with *102*.
I have tried
-n
and-g
.-t
does not help in these messy strings.Can I ignore leading strings to the number with an option or do I have to be clever and script?
-
Jonathan Leffler over 11 yearsNote that the
-v
option tols
is a GNU extension; since you're on Linux, that's OK, but it is not portable to other systems necessarily. -
AWE over 11 yearsExactly! it was the
k
option that I had forgotten and was "hidden" in the man pages. -
becko about 9 yearsis there an analogous command with
find
instead ofls
(or perhaps piping tosort
)? -
interestinglythere about 9 yearsOn Mac, can you can
brew install coreutils
and usegls
. -
tripleee almost 8 yearsDon't use
ls
in scripts, though. -
tripleee almost 8 years@becko
find
always traverses the tree in a deterministic order and outputs the files in the order it finds them. -
Muhamed Huseinbašić about 5 years@becko sort has -V option which is "natural sort of (version) numbers within text"