Dlaczego „sortowanie” ignoruje znaki specjalne, takie jak gwiazdka?

27

Myślałem, że sortposortują razem wspólne przedrostki, ale nie zawsze tak się dzieje. Weźmy na przykład:

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

Potem sortspodziewam się, że wszystko AT*skończy się w jednym kawałku, ale po uruchomieniu tych danych dane sortwyjściowe ==. Dlaczego? Nie określam żadnej opcji ignorowania znaków innych niż alfabetyczne. Właśnie sort dict > out.

Moja wersja sortpochodzi coreutils 8.5-1ubuntu3.

Aaron Digulla
źródło
Pracuje dla mnie. Może gdzieś alias?
Matthieu Cartier

Odpowiedzi:

17
sort --version-sort filename 

To zachowuje naturalny porządek liczb.

Reuben L.
źródło
4
+1 To działa, ale dlaczego? W tekście jest tylko kilka pojedynczych cyfr.
Aaron Digulla,
2
Działa bez potrzeby zmiany środowiska, +1
Meredith
@AaronDigulla: Podejrzewam, że traktuje łańcuchy w sortowaniu wersji jako prawie najgłupszy sposób sortowania rzeczy, więc ignoruje ustawienia regionalne i obsługuje liczby tylko w specjalny sposób.
JohnEye
23

Ustawienie LC_ALL = C przywróciło tradycyjną kolejność sortowania w moim przypadku. Pakiet: coreutils Wersja: 8.5-1ubuntu3

export LC_ALL=C 
rahul_jk
źródło
LANG=Cdziała również. Co mnie zastanawia: LANGjest ustawione en_US.UTF-8; dlaczego *nadal jest traktowany specjalnie?
Aaron Digulla,
2
LC_COLLATEto ustawienie specyficzne dla sortitd.
Wstrzymane do odwołania.
pracuje dla mnie w Raspbian // Pixel ... rodzaj rozdrażnienia ignorowanie znaków specjalnych było dla mnie zabójstwem ... dzięki.
ZEE,
2
nie ma potrzeby, exporta nawet nie ustawiać lokalnych i być może bałagan z czymś innym. Wystarczy ustawić go w wywołaniu rodzaju: LC_ALL=C sort. Np. echo -e 'a\n*\n*b\nc' | LC_ALL=C sortLC_ALL nie zostanie zmieniony poza wywołaniem sortowania
Hashbrown,
1

Działa zgodnie z oczekiwaniami dla mnie (na cygwin).

sort input > output prowadzi do

AT * AD
AT * Ad
AT * Eydie
AT * ja
AT * IUD
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Reklama AT *
AT * oczach
AT * id
AT * owies
AT * przeważają
AT * należne
AT * zachwycił się
AT0S * osiemdziesiątych
Słuchawki AT0S *
ATF * ATV
ATF * Ediva
ATF * przysł
ATF * edify
Adwokat ATFKT *
ATFKT * wygrał
ATFKTNK * rzecznictwo
Zwolennicy ATFKTS *
ATHT * Whitehead
ATHT * whitehead
Przysłowie ATJ *
Uwaga ATNXNS *
ATNXNS * tłumienie
ATNXNS * samozapłon
Adobe ATP *
ATP0K * idiopatyczny
ATT * wighted
ATT * mądry
ATT * zalesiony
ATX * atishoo

Czy rodzaj jest do czegoś pseudonimem? próbować\sort

Również

Ustawienia regionalne określone przez środowisko wpływają na porządek sortowania. Ustaw LC_ALL = C, aby uzyskać tradycyjny porządek sortowania, który używa rodzimych wartości bajtów

Nifle
źródło
Brak aliasu. Musi to być funkcja specyficzna dla Ubuntu / Debian.
Aaron Digulla,
1

Wersja: sort (GNU coreutils) 8.26

Robię to inline:

LANG=C sort FILE

Lub według funkcji (zmienia oryginalny plik):

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

Aby udzielić prostej odpowiedzi na podstawie komentarzy innych osób, nie zmieni to środowiska:

input_program | LC_COLLATE=C sort | output_program

lub

LC_COLLATE=C sort < input_file > output_file

lub ich kombinacje.

Walf
źródło
0

Dzięki sortowaniu GNU możesz użyć --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
źródło