GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Geben Sie die Sortierreihenfolge mit LC_COLLATE an, sodass Kleinbuchstaben vor Großbuchstaben stehen

Ich kenne keine Gebietsschemas, die standardmäßig in dieser Reihenfolge sortieren. Die Lösung besteht darin, ein benutzerdefiniertes Gebietsschema mit einer benutzerdefinierten Sortierreihenfolge zu erstellen. Wenn jemand vier Jahre später auf benutzerdefinierte Weise sortieren möchte, ist hier der Trick.

Die überwiegende Mehrheit der Locales gibt keine eigene Sortierreihenfolge an, sondern kopiert die in /usr/share/i18n/locales/iso14651_t1_common definierte Sortierreihenfolge das ist es also, was Sie bearbeiten möchten. Anstatt die Sortierreihenfolge für fast jedes Gebietsschema zu ändern, indem Sie den ursprünglichen iso14651_t1_common ändern , ich schlage vor, Sie machen eine Kopie. Details zur Funktionsweise der Sortierreihenfolge und zum Erstellen eines benutzerdefinierten Gebietsschemas in Ihrem $HOME Verzeichnisse ohne Root-Zugriff finden Sie in dieser Antwort auf eine ähnliche Frage.

Sehen Sie sich an, wie a und A werden basierend auf ihren Einträgen in iso14651_t1_common geordnet :

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

b und B sind ähnlich:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

Das sehen wir beim ersten Durchlauf, beide a und A haben das Sortiersymbol <a> , während beide b und B haben das Sortiersymbol <b> . Seit <a> erscheint vor <b> in iso14651_t1_common , a und A vor b gebunden sind und B . Der zweite Durchgang löst die Bindungen nicht, da alle vier Zeichen das Sortierungssymbol <BAS> haben , aber während des dritten Durchgangs werden die Bindungen aufgelöst, da das Sortiersymbol für Kleinbuchstaben <MIN> erscheint in Zeile 3467 vor dem Sortiersymbol für Großbuchstaben <CAP> (Zeile 3488). Die Sortierreihenfolge endet also als a , A , b , B .

Das Vertauschen des ersten und dritten Sortiersymbols würde die Buchstaben zuerst nach Groß- und Kleinschreibung (untere dann obere), dann nach Akzent (<BAS>) sortieren bedeutet ohne Akzent), dann in alphabetischer Reihenfolge. Allerdings , beide <MIN> und <CAP> stehen vor den numerischen Ziffern, so dass dies den unerwünschten Effekt hätte, Ziffern nach Buchstaben zu setzen.

Der einfachste Weg, Ziffern zuerst zu behalten, während Sie alle erstellen Kleinbuchstaben stehen vor all Großbuchstaben sollen alle Buchstaben beim ersten Vergleich binden, indem sie alle gleich <a> gesetzt werden . Um sicherzustellen, dass sie innerhalb der Groß- und Kleinschreibung alphabetisch sortiert werden, ändern Sie das letzte Sortiersymbol von IGNORE zum aktuellen ersten Sortiersymbol. Nach diesem Muster a würde werden:

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A würde werden:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b würde werden:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B würde werden:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

und so weiter für die restlichen Buchstaben.

Nachdem Sie eine angepasste Version von iso14651_t1_common erstellt haben , befolgen Sie die Anweisungen in der oben verlinkten Antwort, um Ihr benutzerdefiniertes Gebietsschema zu kompilieren.


Einstellung LC_COLLATE=C reicht nicht immer aus, Großbuchstaben vor Kleinbuchstaben zu sortieren. Möglicherweise müssen Sie LC_ALL=C festlegen .

Das berücksichtigt auch nicht-alphanumerische und sogar nicht druckbare Zeichen, aber wenn Sie das nicht wollen, gibt es die Optionen -d und -i (beschrieben in man sort ), um das auszuschalten.

Bei Multibyte-Eingabe, wie UTF-8 mit Nicht-ASCII-Zeichen, wird es jedoch wahrscheinlich schlecht fehlschlagen.

Um Kleinbuchstaben (in der Reihenfolge) vor Großbuchstaben (in der Reihenfolge) zu erhalten, besteht der beste Weg, den ich mir vorstellen kann, darin, keine vollwertige Programmiersprache auszubrechen, indem der Fall aller Buchstaben vor der Sortierung umgekehrt und umgekehrt wird danach.

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

Ich bin kein Experte, aber ich habe noch nie ein Gebietsschema gesehen, das eine solche Sortierung definiert. AFAIK ist diese Sortierung nur in C, wo sie auf ASCII-Werten basiert. (Normalerweise würde ich das einfach durch ein Skript lösen.)

Allerdings habe ich das noch nie gemacht, aber vielleicht möchten Sie einen Blick auf die Manpages localedef(1) und locale(5) werfen, um zu verstehen, wie Locales definiert sind, und schließlich Ihr eigenes zu definieren.

Vergessen Sie auch nicht, dass das C-Gebietsschema alle diakritischen Zeichen oder Sonderzeichen nicht so behandelt, wie Sie es vielleicht möchten. Beispielsweise wird á nicht eingefügt in der Nähe von a oder Ł in der Nähe von L . In solchen Fällen wäre das ursprüngliche Gebietsschema der Sprache wahrscheinlich ein besserer Ausgangspunkt.


Linux
  1. Analysieren Sie den Linux-Kernel mit ftrace

  2. Lassen Sie sich mit sort in der Befehlszeile sortieren

  3. Sortieren mehrerer Schlüssel mit Unix-Sortierung

  4. Sortieren nach dem letzten Feld einer Zeile

  5. Ist es möglich, ein Element im DOM mit Puppeteer zu ändern, bevor ein Screenshot erstellt wird?

Lernen Sie Linux mit dem Raspberry Pi

Linux-Sortierungsbefehl mit Beispielen

Deaktivieren Sie die Anmeldung mit dem Root-Konto

10 Nützliche Beispiele für den Sort-Befehl in Linux

Sichern Sie Linux mit der Sudoers-Datei

Leerzeichen vor Großbuchstaben einfügen