Comportamento errato del comando di ordinamento?


14

Ho provato a ordinare il contenuto di un file nel desktop Ubuntu 14.04 (Trusty Tahr). Nel mio caso, il risultato atteso dovrebbe essere lo stesso del contenuto originale, ma il risultato effettivo non lo è. Perché?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
Ti consegno un piccolo trofeo per il tuo uso inutile dicat .
David Foerster,

3
Il commento di @DavidFoerster è un modo divertente di sottolineare che puoi sostituire cat test.txt | sortcon sort test.txt:)
Volker Siegel

@VolkerSiegel: True, anche se ci sono formulazioni utili da usare catper iniziare. Ad esempio cat FILE | grep dev | sort, visualizzerà solo le righe con "dev" (in ordine ordinato). L'utilizzo sort FILE | grep devproduce lo stesso risultato ma colorato.
AlainD

Risposte:


17

È possibile utilizzare la LC_ALLvariabile, impostarla su LC_ALL=Cprima di chiamaresort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Leggi questa risposta, se vuoi sapere cos'è magicamente LC_ALL=C. Ecco un breve riassunto:

La locale C è una locale speciale che dovrebbe essere la locale più semplice. Si potrebbe anche dire che mentre le altre impostazioni locali sono per gli esseri umani, le impostazioni locali C sono per i computer. Nella locale C, i caratteri sono singoli byte, il set di caratteri è ASCII, l'ordinamento si basa sui valori byte.

Inoltre, come ha indicato @KenMollerup, citiamo man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Pertanto, quando si utilizza l'ordinamento con LC_ALL=C, l'ordinamento confronta i simboli in ordine byte. Altrimenti sortignorerà tutti i caratteri non alfanumerici.


Scusa non l'ho visto, ho reagito al commento!
Ken Mollerup,

@KenMollerup grazie per aver indicato man sort. Non me ne sono accorto
c0rp

8

L'ordinamento utilizza l'ordinamento alfabetico e numerico, come noi, i caratteri speciali come + - <> ... vengono ignorati, i numeri vengono trattati in modo numerico, quindi 1, 2, 3 .. precede 11, 12 1066 1104 - vedi!

Quindi la tua lista è vista come: aa, ab, ab, ac, ac


Esiste un'opzione per l'ordinamento, in modo che non ignori i caratteri speciali in modo che test.txt ordinerà il modo desiderato?
Doug Smythies,

6
Vedi questo nell'ordinamento man: *** ATTENZIONE *** Le impostazioni locali specificate dall'ambiente influiscono sull'ordinamento. Impostare LC_ALL = C per ottenere il tradizionale ordinamento che utilizza valori di byte nativi.
Ken Mollerup,

@KenMollerup, aggiungi maggiori informazioni alla tua risposta. Aggiungi citazione da man sort, aggiungi esempi.
circa

Sì, ma ero troppo lento, vedi la risposta di c0rp di seguito.
Ken Mollerup,
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.