Was ist die Standardreihenfolge von Linux?


18

Lange Zeit dachte ich, dass das Standardverhalten des sortProgramms die ASCII-Reihenfolge verwendet. Wenn ich jedoch die folgenden Zeilen sortohne Argumente eingebe:

#
@

Ich habe:

@
#

Laut der ASCII-Tabelle sind #es jedoch 35 und @64. Ein weiteres Beispiel ist:

A
a

Und die Ausgabe ist:

a
A

Kann das jemand erklären? Was ist übrigens "Wörterbuchreihenfolge" bei der Verwendung sort -d?


5
Sortierreihenfolge hängt von Ihren lokalen Einstellungen
janneb

2
Aber es ist zumindest in der GNU-Sortierung standardmäßig alphabetisch sortiert.
jarno

Antworten:


17

Anscheinend verwenden Sie ein Nicht-POSIX-Gebietsschema.

Versuchen:

export LC_ALL=C

und dann sort.

info sort klar sagt:

(1) Wenn Sie ein Nicht-POSIX-Gebietsschema verwenden (z. B. indem Sie "LC_ALL" auf "en_US" setzen), erzeugt "sort" möglicherweise eine Ausgabe, die anders sortiert ist als Sie es gewohnt sind. In diesem Fall setzen Sie die Umgebungsvariable LC_ALL auf C. Beachten Sie, dass bei der Einstellung nur LC_COLLATE zwei Probleme auftreten. Erstens ist es unwirksam, wenn `LC_ALL 'ebenfalls gesetzt ist. Zweitens hat es undefiniertes Verhalten, wenn LC_CTYPE (oder LANG, wenn LC_CTYPE nicht gesetzt ist) auf einen inkompatiblen Wert gesetzt ist. Zum Beispiel erhalten Sie undefiniertes Verhalten, wenn LC_CTYPE "ja_JP.PCK" ist, aber LC_COLLATE "" en_US.UTF-8 "ist.


3
Das OP fragt nach der Sortierreihenfolge und nicht nach der Art der Änderung.

1
Danke, ich habe auf meinem Computer getestet, und die Gebietsschemaeinstellungen wirken sich auf das Sortierverhalten aus

2

Um die Sortierreihenfolge zu bestimmen, erstellen Sie einfach eine Datei mit einem anderen Zeichen in jeder Zeile und sortieren Sie sie. Die resultierende Ausgabe teilt Ihnen die Sortierreihenfolge mit.


Nett, einfach und effizient

1
Generell eine sehr gute Idee, die aber nicht immer ausreicht. Eine Kollatierung muss nicht nur für einzelne Zeichen definiert werden. Einige Kollatierungen behandeln "ae" wie eine Ligatur oder Ligaturen wie eine Zersetzung. Ein anderer Fall ist, dass viele Kollatierungen 'a' und 'A' als gleich behandeln, aber die Reihenfolge, die Sie beim Testen sehen, sagt Ihnen das nicht (es kann Ihnen sagen, ob die Sortierung stabil ist). Und ein Einzelzeichentest zeigt nicht an, ob die Tabulatorerweiterung, die Leerraumnormalisierung usw. wirksam sind. Trotzdem ist es ein sehr guter Anfang.
TextGeek

1
(Für die Bearbeitung des vorherigen Kommentars zu spät) - Solange Sie tatsächlich eine ausreichende Anzahl von Zeichen enthalten, können Sie die Groß- und Kleinschreibung ignorieren, indem Sie (zum Beispiel) aAbB anstelle von abAB sehen.
TextGeek

2

Wie man sortgesagt, bedeutet "Wörterbuchreihenfolge" "nur Leerzeichen und alphanumerische Zeichen berücksichtigen". Zum Beispiel angesichts der Daten

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

der schmucklose sortBefehl erzeugt

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

(stellt die Linien , die mit dem Raum und die Zeichen beginnen !, #, $, %, und @Symbolen 1 vor den Linien , die mit Buchstaben und Zahlen beginnen, dh, alphanumerische Zeichen ), aber sort -derzeugt

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

  dogsist immer noch der erste, da er mit Leerzeichen beginnt, die Sonderzeichen (Interpunktion) jedoch ignoriert werden.  17kommt vor 42und foxkommt zwischen brownund jumps, trotz der Tatsache, dass 42und foxCharaktere vor ihnen haben, die sie normalerweise vor dem bewegen würden 17.
____________
1 in der Reihenfolge ihrer ASCII-Werte: Leerzeichen = 040, != 041, #= 043, $= 044, %= 045 und @= 0100. Beachten Sie, dass dies (ohne Berücksichtigung der Leertaste) bei einigen Tastaturen ungefähr von links nach rechts ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.