Perché 'sort' ignora i caratteri speciali, come l'asterisco?


27

Ho pensato che sortavrebbero ordinato i prefissi comuni insieme, ma ciò non sempre accade. Prendi questo input per esempio:

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

Dopo sort, mi aspetto che tutto AT*finisca in un unico pezzo, ma quando si eseguono questi dati sort, l' ==input di output . Perché? Non sto specificando alcuna opzione per ignorare caratteri non alfabetici o altro. Basta sort dict > out.

La mia versione di sortproviene da coreutils 8.5-1ubuntu3.


Per me va bene. Forse un alias da qualche parte?
Matthieu Cartier,

Risposte:


17
sort --version-sort filename 

Ciò preserva l'ordine naturale dei numeri.


4
+1 Funziona ma perché? Ci sono solo alcune cifre singole nel testo.
Aaron Digulla,

2
Funziona senza bisogno di cambiare l'ambiente, +1
Meredith

@AaronDigulla: sospetto che tratti le stringhe nell'ordinamento delle versioni come quasi il modo più stupido di ordinare le cose, quindi ignora le impostazioni locali e gestisce i numeri solo in un modo speciale.
JohnEye,

23

L'impostazione LC_ALL = C nel mio caso ha ripristinato il tradizionale ordinamento. Pacchetto: coreutils Versione: 8.5-1ubuntu3

export LC_ALL=C 

LANG=Cfunziona anche. Cosa mi confonde: LANGè impostato su en_US.UTF-8; perché è *ancora trattato speciale ??
Aaron Digulla,

2
LC_COLLATEè l'impostazione specifica per sort, ecc.
In pausa fino a nuovo avviso.

funziona per me in Raspbian // Pixel ... il tipo di "fastidio" che ignora i caratteri speciali mi stava uccidendo ... grazie.
ZEE,

2
non c'è bisogno exporto addirittura impostare locale e possibilmente fare confusione con qualcos'altro. Basta impostare nella chiamata a un ordine: LC_ALL=C sort. Ad esempio echo -e 'a\n*\n*b\nc' | LC_ALL=C sort, LC_ALL non verrà modificato al di fuori della chiamata per l'ordinamento
Hashbrown,

1

Funziona come previsto per me (su Cygwin).

sort input > output risultati in

UN PO
Un po
AT * Eydie
AT * Mi piacerebbe
AT * IUD
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
Un po
AT * dagli occhi
AT * id
AT * avena
AT * superano
AT * dovuto
AT * entusiasmato
AT0S * eightieths
AT0S * di eyetooth
ATF * ATV
ATF * Ediva
ATF * adv
ATF * edify
ATFKT * avvocato
ATFKT * ominidi
ATFKTNK * sostenendo
ATFKTS * sostenitori
ATHT * Whitehead
ATHT * Whitehead
ATJ * adagio
ATNXNS * di attenzione
ATNXNS * di attenuazione
ATNXNS * di autoaccensione
ATP * adobe
ATP0K * idiopatica
ATT * wighted
ATT * witted
ATT * boscoso
ATX * atishoo

L'ordinamento è aliasato a qualcosa? provare\sort

Anche

Le impostazioni internazionali specificate dall'ambiente influiscono sull'ordinamento. Impostare LC_ALL = C per ottenere il tradizionale ordinamento che utilizza valori di byte nativi


Nessun alias. Deve essere una funzionalità specifica di Ubuntu / Debian.
Aaron Digulla,

1

Versione: sort (GNU coreutils) 8.26

Lo faccio in linea:

LANG=C sort FILE

O per funzione (cambia il file originale):

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

1

Per fornire una risposta semplice basata sui commenti degli altri, ciò non cambia l'ambiente:

input_program | LC_COLLATE=C sort | output_program

o

LC_COLLATE=C sort < input_file > output_file

o loro combinazioni.


0

Con GNU sort puoi usare --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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.