Wrong order with sort command

localesort

How to get sort command working with data separated by "|"
(pipe character) ?

Consider this sample file called "x" which have two fields:

axis-AXIS|OK
axis-AXISR|OK
axis-AXISD2X|OK
axis-AXISA|OK
axis-AXISD1|OK
axis-AXIS1RX|OK
axis-AXISR1M|OK
axis-AXISD2|FALSE
axis-AXISMD|FALSE
axis-AXISM|FALSE
axis-AXISE|OK
axis-AXISD|OK

My locale:

echo $LC_ALL
C

When it is sorted the character "|" seems to be part of the key producing a strange assortment:

sort -t"|" x

axis-AXIS1RX|OK
axis-AXISA|OK
axis-AXISD1|OK
axis-AXISD2X|OK
axis-AXISD2|FALSE
axis-AXISD|OK
axis-AXISE|OK
axis-AXISMD|FALSE
axis-AXISM|FALSE
axis-AXISR1M|OK
axis-AXISR|OK
axis-AXIS|OK

Specifying a field key sort -t"|" -k1 x nothing changes.

Best Answer

Without the closing field number with -k, it will consider all fields starting from 1. You need :

sort -k1,1 -t'|' file.txt

Test :

$ sort -k1,1 -t'|' file.txt 
axis-AXIS|OK
axis-AXIS1RX|OK
axis-AXISA|OK
axis-AXISD|OK
axis-AXISD1|OK
axis-AXISD2|FALSE
axis-AXISD2X|OK
axis-AXISE|OK
axis-AXISM|FALSE
axis-AXISMD|FALSE
axis-AXISR|OK
axis-AXISR1M|OK

If your locale is not C, you can set it on the fly :

LC_ALL=C sort -k1,1 -t'|' file.txt
Related Question