How to sort lines that contain "_" numerically?

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

profile_10_1_1
profile_10_1_2
profile_1_1_1

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:

profile_1_1_1
profile_1_1_2
....
profile_9_1_1
....
profile_10_1_1
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.