Sortowanie GNU według wielkości liter

35

sortNarzędzie w Ubuntu 10.04 (Lucid) zawsze sortować według wielkości liter, tak jak w przypadku określenia --ignore-casedo niego.

The two sort just give the same result: 

echo -e "c\nb\nB\na" | sort
echo -e "c\nb\nB\na" | sort --ignore-case

Ale czasami chcę sortować według wielkości liter, więc najpierw pojawiają się wielkie litery, a następnie małe litery. Czy to możliwe?

Xiè Jìléi
źródło

Odpowiedzi:

31

Zastąp porządek sortowania.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort
Ignacio Vazquez-Abrams
źródło
5
Działa to, ale z definicji tylko wtedy, gdy nie ma obcych znaków. są w grze; będą sortować po liter 7-bitowy ASCII; spróbuj echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. Czy fakt, że GNU sortz nielokalnym Custawieniem zawsze wykonuje sortowanie bez rozróżniania wielkości liter, nie powinien być uważany za błąd ?
mklement0
Jeśli chodzi o „obce znaki”, C.UTF-8locale ( LC_COLLATE=C.UTF-8) sortuje z rozróżnianiem wielkości liter, a znaki „UTF-8” inne niż ascii „normalnie”. Niestety, nie jest dostępny w glibc w górę i tylko łatany przez Debiana, Ubuntu i pochodne.
aplazja
13

Co ciekawe, dostępna jest jeszcze jedna kolejność sortowania:

echo -e "c\nb\nB\na" | LC_COLLATE=C sort --ignore-case

która umieszcza wielką literę przed odpowiadającą jej małą literą.

Oto porównanie ich wyników (dodałem „d” i „D”) w en_US.UTF-8ustawieniach regionalnych (z wyjątkiem sytuacji, gdy zostały zastąpione):

  1. echo -e "d\nD\nc\nb\nB\na" | sort
  2. echo -e "d\nD\nc\nb\nB\na" | sort --ignore-case
  3. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort
  4. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort --ignore-case

Wydajność:

1   2   3   4
-   -   -   -
a   a   B   a
b   b   D   B
B   B   a   b
c   c   b   c
d   d   c   D
D   D   d   d
Wstrzymano do odwołania.
źródło
Ciekawy; Widzę to zachowanie w GNU sort v5.93(pochodzi z OS X 10.9.3 (!)) Oraz v8.13, ale NIE w v8.21i v8.22. Myślę, że wyniki 2. i 4. nadal można uznać za równoważne (ale to oczywiście zmieniłoby się po dodaniu obcych znaków).
mklement0