Warum ignoriert 'sort' Sonderzeichen wie das Sternchen?

27

Ich dachte, das sortwürde gemeinsame Präfixe zusammen sortieren, aber das passiert nicht immer. Nehmen Sie diese Eingabe zum Beispiel:

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo

Danach sortwürde ich erwarten, dass alles AT*in einem Block endet, aber wenn Sie diese Daten durchlaufen sort, wird die Ausgabe ==eingegeben. Warum das? Ich gebe keine Option an, um nicht-alphabetische Zeichen oder irgendetwas zu ignorieren. Nur sort dict > out.

Meine Version von sortkommt von coreutils 8.5-1ubuntu3.

Aaron Digulla
quelle
Funktioniert bei mir. Vielleicht irgendwo ein Alias?
Matthieu Cartier

Antworten:

17
sort --version-sort filename 

Dadurch bleibt die natürliche Reihenfolge der Zahlen erhalten.

Reuben L.
quelle
4
+1 Das funktioniert aber warum? Der Text enthält nur wenige einstellige Zeichen.
Aaron Digulla
2
Funktioniert, ohne dass die Umgebung geändert werden muss, +1
Meredith
@AaronDigulla: Ich vermute, dass es die Strings in der Versionssortierung als fast die dümmste Art und Weise behandelt, Dinge zu sortieren. Daher ignoriert es das Gebietsschema und behandelt Zahlen nur auf eine spezielle Art und Weise.
JohnEye
23

Durch Festlegen von LC_ALL = C wurde die herkömmliche Sortierreihenfolge in meinem Fall wiederhergestellt. Paket: coreutils Version: 8.5-1ubuntu3

export LC_ALL=C 
rahul_jk
quelle
LANG=Cfunktioniert auch. Was mich verwirrt: LANGist eingestellt auf en_US.UTF-8; warum wird *noch was besonderes behandelt ???
Aaron Digulla
2
LC_COLLATEist die Einstellung, die spezifisch für sortusw. ist.
Bis auf weiteres angehalten.
arbeitet für mich in Raspbian // Pixel ... die Art "Ärger", die die Sonderzeichen ignoriert, hat mich umgebracht ... danke.
ZEE
2
Keine Notwendigkeit, exportlokale und möglicherweise mit etwas anderem zu verwirren. Einfach einstellen in dem Aufruf von sort: LC_ALL=C sort. echo -e 'a\n*\n*b\nc' | LC_ALL=C sortZum Beispiel wird LC_ALL nicht außerhalb des Aufrufs zum Sortieren geändert
Hashbrown
1

Es funktioniert wie erwartet für mich (auf Cygwin).

sort input > output Ergebnisse in

EIN BISSCHEN
Ein bisschen
AT * Eydie
AT * Ich würde
AT * IUD
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Ein bisschen
AT * musterte
AT * id
AT * Hafer
AT * überwiegen
AT * geschuldet
AT * hat mich beeindruckt
AT0S * Achtzigstel
AT0S * Bluetooth
ATF * ATV
ATF * Ediva
ATF * adv
ATF * edify
Fürsprecher von ATFKT *
ATFKT * hat sich geschlagen
ATFKTNK * befürwortet
Befürworter von ATFKTS *
ATHT * Whitehead
ATHT * Whitehead
ATJ * Sprichwort
ATNXNS * Aufmerksamkeit
ATNXNS * Dämpfung
ATNXNS * Selbstentzündung
ATP * Adobe
ATP0K * idiopathisch
ATT * geklärt
ATT * witted
ATT * bewaldet
ATX * atishoo

Ist die Sortierung auf etwas ausgerichtet? Versuchen\sort

Ebenfalls

Das von der Umgebung angegebene Gebietsschema wirkt sich auf die Sortierreihenfolge aus. Setzen Sie LC_ALL = C, um die herkömmliche Sortierreihenfolge abzurufen, die native Bytewerte verwendet

Nifle
quelle
Kein Alias. Muss eine Ubuntu / Debian-spezifische Funktion sein.
Aaron Digulla
1

Version: sort (GNU coreutils) 8.26

Ich mache es inline:

LANG=C sort FILE

Oder nach Funktion (ändert die Originaldatei):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}
Regis Barbosa
quelle
1

So geben Sie eine einfache Antwort, die auf den Kommentaren anderer basiert und Ihre Umgebung nicht verändert:

input_program | LC_COLLATE=C sort | output_program

oder

LC_COLLATE=C sort < input_file > output_file

oder Kombinationen davon.

Walf
quelle
0

Mit GNU sort können Sie Folgendes verwenden --dictionary-order:

NAME
       sort - sort lines of text files

SYNOPSIS
       sort [OPTION]... [FILE]...
       sort [OPTION]... --files0-from=F

DESCRIPTION
       Write sorted concatenation of all FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are mandatory for short options too.  Ordering options:

       -b, --ignore-leading-blanks
              ignore leading blanks

       -d, --dictionary-order
              consider only blanks and alphanumeric characters
Igor
quelle