How to sort lines that contain “_” numerically

sort

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

Best Answer

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 '%s\n' ${(fno)"$(<filename)"}

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

sort -t_ -k1,1 -k2,2n -k3,3n -k4,4n -k5,5n filename
Related Question