How to sort lines that contain "_" numerically?

Here’s a subset of the file names in my file:


I’m trying to sort them numerically in ascending order, that is starting from 1 onwards. I used the following command

sort -n filename

and also tried this:

sort -nk filename

But the ones with 10 will always be at the top of the list.

How do I write a command to get this desired output:

Asked By: cwmwl


-V does exactly what you want.

-V, --version-sort
              natural sort of (version) numbers within text

Works at least in GNU sort.

Answered By: jimmij

FreeBSD and GNU sort have a -V option for that.

sort -V < filename

GNU ls has a -v option. So if those files do exist, you could do:

xargs -d 'n' < filename ls -dv --

zsh has parameter expansion flags to sort arrays numerically:

printf '%sn' ${(fno)"$(<filename)"}

Otherwise, portably, you’d have to do it like:

sort -t_ -k1,1 -k2,2n -k3,3n -k4,4n -k5,5n filename
Answered By: Stéphane Chazelas
Categories: Answers Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.