Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Consider the following input to sort:

cat > foo <<EOM
D,,5014978
DD,,25
D,I,1972765530
D,Y,4223624
-,Y,71285059
YA,I,2
EOM

Now try running sort foo

The output is not sorted when trying this on any of my linux boxes (gnu coreutils versions 6.9-7.4). The output is sorted when run under cygwin (gnu coretuils 8.5). Comments?

share|improve this question

1 Answer 1

up vote 12 down vote accepted

Sorting depends on the locale; specifically, it depends on $LC_COLLATE (possibly overridden by $LC_ALL), falling back to $LANG if it doesn't exist. The command locale will show you what values you're effectively working with. See man 3 strcoll, man 3 setlocale, etc.

LC_COLLATE=C (or POSIX or no locale at all) results in a strict byte-by-byte comparison.

LC_COLLATE=en_US.utf8 results in an alphabetical-equivalence sort, with punctuation ignored and characters within the same equivalence class treated equally.

share|improve this answer
    
Indeed, export LC_COLLATE=C makes sort behave as expected –  Leo Alekseyev Nov 30 '10 at 0:47
1  
Accents are not completely ignored. Stephane sorts before Stéphane, but Stephanie sorts after Stéphane. é is equivalent to e (like ê, ë, ...), but if there's a tie, then the order between those is well defined. It's the same in a good old paper dictionary. –  Stéphane Chazelas May 16 at 14:43

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.