Search code examples
linuxbashsortinggnu-coreutils

Preserve original order if numeric value is equal in coreutils sort?


Consider this snippet:

echo '7 a
3 c
3 b
2 first
2 second
2 third
2 fourth
2 fifth
9 d
2 sixth
' | sort -n -k 1

It gives an output of:

2 fifth
2 first
2 fourth
2 second
2 sixth
2 third
3 b
3 c
7 a
9 d

While the list is correctly ordered numerically keyed by first character, also for those values which are contiguous and equal, the original order has been shuffled. I would like to obtain:

2 first
2 second
2 third
2 fourth
2 fifth
2 sixth
3 c
3 b
7 a
9 d

Is this possible to do with sort? If not, what would be the easiest way to achieve this kind of sorting using shell tools?


Solution

  • Just add the -s (stable sort) flag, this disables last-resort comparison

    echo '7 a
    3 c
    3 b
    2 first
    2 second
    2 third
    2 fourth
    2 fifth
    9 d
    2 sixth
    ' | sort  -k 1,1n -s
    
    2 first
    2 second
    2 third
    2 fourth
    2 fifth
    2 sixth
    3 c
    3 b
    7 a
    9 d