Jaka jest domyślna kolejność sortowania w systemie Linux?

18

Przez długi czas myślałem, że domyślnym zachowaniem sortprogramu jest używanie kolejności ASCII. Jednak gdy wprowadzam następujące wiersze sortbez żadnych argumentów:

#
@

Mam:

@
#

Ale zgodnie z tabelą ASCII #wynosi 35 i @ma 64. Innym przykładem jest:

A
a

Wyjście to:

a
A

Czy ktoś może to wyjaśnić? Nawiasem mówiąc, czym jest „porządek słownikowy” podczas używania sort -d?

G-Man mówi „Przywróć Monikę”
źródło
5
kolejność sortowania zależy od ustawień regionalnych
janneb
2
Ale domyślnie jest to kolejność alfabetyczna przynajmniej w sortowaniu GNU.
jarno

Odpowiedzi:

17

Wygląda na to, że używasz ustawień narodowych innych niż POSIX.

Próbować:

export LC_ALL=C

i potem sort.

info sort wyraźnie mówi:

(1) Jeśli używasz ustawień narodowych innych niż POSIX (np. Ustawiając `LC_ALL 'na` en_US'), wtedy `sort 'może generować dane wyjściowe, które są sortowane inaczej niż jesteś przyzwyczajony. W takim przypadku ustaw zmienną środowiskową `LC_ALL 'na` C'. Zauważ, że ustawienie tylko `LC_COLLATE 'ma dwa problemy. Po pierwsze, jest nieskuteczne, jeśli ustawiony jest również parametr `LC_ALL '. Po drugie, ma niezdefiniowane zachowanie, jeśli `LC_CTYPE '(lub` LANG', jeśli `LC_CTYPE 'nie jest ustawione) jest ustawione na niezgodną wartość. Na przykład zachowanie jest niezdefiniowane, jeśli `LC_CTYPE 'to` ja_JP.PCK', ale `LC_COLLATE 'to` en_US.UTF-8'.

kodaddict
źródło
3
OP pyta, jaki jest porządek sortowania, a nie jak go zmienić.
1
Dzięki, przetestowałem na moim komputerze, a ustawienia regionalne wpływają na zachowanie sortowania
3

Aby ustalić kolejność sortowania, po prostu utwórz plik z innym znakiem w każdej linii i posortuj go. Wynikowy wynik pokaże kolejność sortowania.

Gabe
źródło
Ładne, proste i wydajne
1
Ogólnie bardzo dobry pomysł, ale nie zawsze wystarcza. Zestawienie nie musi być definiowane tylko dla poszczególnych znaków. Niektóre zestawienia traktują „ae” jak ligaturę lub ligatury tak, jakby były rozłożone. Innym przypadkiem jest to, że wiele zestawień traktuje „a” i „A” jako równe, ale kolejność, którą widzisz podczas testowania, tego nie mówi (może ci powiedzieć, czy sort jest stabilny). A test jednoznakowy nie określa, czy działają tabulatory, normalizacja białych znaków itp. Niemniej jednak jest to bardzo dobre miejsce na rozpoczęcie.
TextGeek,
1
(za późno, aby edytować poprzedni komentarz) - o ile faktycznie zawierasz wystarczająco różnorodny zakres znaków, możesz odróżnić ignorowanie wielkości liter od zobaczenia (na przykład) aAbB zamiast abAB.
TextGeek,
2

Jak man sortmówi, „kolejność słownika” oznacza „rozważ tylko spacje i znaki alfanumeryczne”. Na przykład biorąc pod uwagę dane

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

sortprodukuje się bez ozdoby

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(oddanie linii, które zaczynają się od znaków przestrzeni i !, #, $, %, i @symboli 1 wyprzedza linii zaczynających się od liter i cyfr, tzn znaków alfanumerycznych ), ale sort -dprodukuje

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsjest nadal pierwszy, ponieważ zaczyna się od spacji, ale znaki specjalne (interpunkcyjne) są ignorowane.  17przychodzi przed 42, a foxpochodzi między browni jumps, pomimo faktu, że 42i foxmają znaki przed nimi, które normalnie przenieść je przed 17.
____________
1 w kolejności ich wartości ASCII: spacja = 040, != 041, #= 043, $= 044, %= 045 i @= 0100. Zauważ, że (bez względu na spację) jest to w przybliżeniu kolejność od lewej do prawej na niektórych klawiaturach.

G-Man mówi „Przywróć Monikę”
źródło
1
Kolejność w pierwszym przykładzie, w której tekst jest sortowany jako pierwszy po interpunkcji, może wystąpić, jeśli obowiązującymi ustawieniami narodowymi są C (jak w przypadku LC_ALL = C), ale nie w innych ustawieniach narodowych. Wybór ustawień narodowych zależy od ustawień systemu operacyjnego. Tak więc, bez ozdoby sort powinny być różne w wielu dystrybucjach.
Izaak,