Niewłaściwe zachowanie polecenia sortowania?

14

Próbowałem posortować zawartość pliku na pulpicie Ubuntu 14.04 (Trusty Tahr). W moim przypadku oczekiwany wynik powinien być taki sam jak oryginalna treść, ale rzeczywisty wynik nie. Dlaczego?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
użytkownik2909884
źródło
4
Wręczam ci małe trofeum nagrody za bezużyteczne wykorzystaniecat .
David Foerster,
3
Komentarz od @DavidFoerster jest zabawny sposób wskazując, że można zastąpić cat test.txt | sortprzez sort test.txt:)
Volker Siegel
@VolkerSiegel: To prawda, choć istnieją przydatne formuły używane catna początek. Na przykład cat FILE | grep dev | sortbędą wyświetlać tylko wiersze z „dev” w nich (w posortowanej kolejności). Użycie sort FILE | grep devpowoduje uzyskanie tej samej wydajności, ale zabarwionej.
AlainD

Odpowiedzi:

17

Możesz użyć LC_ALLzmiennej, ustaw ją na LC_ALL=Cprzed wywołaniemsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Przeczytaj odpowiedź, jeśli chcesz wiedzieć, co to jest magicznie LC_ALL=C. Oto krótkie podsumowanie:

Lokalizacja C jest specjalną lokalizacją, która ma być najprostszą lokalizacją. Można również powiedzieć, że podczas gdy inne ustawienia narodowe są przeznaczone dla ludzi, ustawienia regionalne C dotyczą komputerów. W ustawieniach regionalnych C znaki są jednobajtowe, zestaw znaków to ASCII, kolejność sortowania oparta jest na wartościach bajtów.

Ponadto, jak wskazał @KenMollerup, cytat z man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Tak więc, używając sortowania z LC_ALL=C, sortuj symbole porównawcze jednocześnie. W przeciwnym razie sortzignorują wszystkie znaki niealfanumeryczne.

c0rp
źródło
Przepraszam, że tego nie widziałem, zareagowałem na komentarz!
Ken Mollerup,
@KenMollerup dzięki za wskazanie man sort. Nie zauważyłem tego
około
8

Sortowanie wykorzystuje sortowanie alfabetyczne i numeryczne, tak samo jak my, znaki specjalne, takie jak + - <> ... są ignorowane, liczby są traktowane numerycznie, więc 1, 2, 3 .. występuje przed 11, 12 1066 1104 - patrz!

Więc twoja lista jest postrzegana jako: aa, ab, ab, ac, ac

Ken Mollerup
źródło
Czy jest jakaś opcja sortowania, która nie ignoruje znaków specjalnych, takich jak test.txt sortuje pożądany sposób?
Doug Smythies,
6
Zobacz to w man sort: *** OSTRZEŻENIE *** Ustawienia regionalne określone przez środowisko wpływają na porządek sortowania. Ustaw LC_ALL = C, aby uzyskać tradycyjny porządek sortowania, który wykorzystuje natywne wartości bajtów.
Ken Mollerup,
@KenMollerup, dodaj więcej informacji do swojej odpowiedzi. Dodaj cytat z man sort, dodaj przykłady.
c0rp 17.03.15
Tak, ale byłem zbyt powolny, patrz odpowiedź c0rp poniżej.
Ken Mollerup,