Qual è l'ordine predefinito dell'ordinamento Linux?


18

Per un lungo periodo ho pensato che il comportamento predefinito del sortprogramma stesse usando l'ordine ASCII. Tuttavia, quando inserisco le seguenti righe in sortsenza alcun argomento:

#
@

Ho ottenuto:

@
#

Ma secondo la tabella ASCII, #è 35 ed @è 64. Un altro esempio è:

A
a

E l'output è:

a
A

Qualcuno può spiegarlo? A proposito, che cos'è l'ordine dei dizionari quando si usa sort -d?


5
l'ordinamento dipende dalle impostazioni locali
janneb

2
Ma è in ordine alfabetico di default almeno nell'ordinamento GNU.
jarno,

Risposte:


17

Sembra che tu stia utilizzando una locale non POSIX.

Provare:

export LC_ALL=C

e poi sort.

info sort dice chiaramente:

(1) Se si utilizza una locale non POSIX (ad esempio, impostando `LC_ALL 'su` en_US'), allora `sort 'può produrre un output ordinato diversamente da quello a cui si è abituati. In tal caso, impostare la variabile d'ambiente `LC_ALL 'su` C'. Notare che l'impostazione solo di `LC_COLLATE 'ha due problemi. Innanzitutto, è inefficace se è impostato anche `LC_ALL '. In secondo luogo, ha un comportamento indefinito se `LC_CTYPE '(o` LANG', se `LC_CTYPE 'non è impostato) è impostato su un valore incompatibile. Ad esempio, si ottiene un comportamento indefinito se `LC_CTYPE 'è` ja_JP.PCK' ma `LC_COLLATE 'è` en_US.UTF-8'.


3
L'OP chiede quale sia l'ordinamento, non come cambiarlo.

1
Grazie, ho testato sulla mia macchina e le impostazioni locali influiscono sul comportamento di ordinamento

3

Per determinare l'ordinamento, è sufficiente creare un file con un carattere diverso su ogni riga e ordinarlo. L'output risultante ti dirà l'ordinamento.


Bello, semplice ed efficiente

1
Generalmente un'ottima idea, ma non è sempre abbastanza. Non è necessario definire una collazione solo su singoli personaggi. Alcune collazioni trattano "ae" come se fosse una legatura o trattano le legature come se fossero decomposte. Un altro caso è che molte regole di confronto trattano 'a' e 'A' come uguali, ma l'ordine che si vede dai test non te lo dice (potrebbe dirti se il tipo è stabile). E un test a carattere singolo non dice se sono in atto l'espansione della scheda, la normalizzazione degli spazi bianchi, ecc. Tuttavia, è un ottimo punto di partenza.
TextGeek,

1
(troppo tardi per modificare il commento precedente) - fintanto che includi effettivamente una gamma abbastanza diversificata di caratteri, puoi distinguere tra maiuscole e minuscole dal vedere (ad esempio) aAbB invece di abAB.
TextGeek,

2

Come si man sortdice, "ordine del dizionario" significa "considerare solo spazi vuoti e caratteri alfanumerici". Ad esempio, dati i dati

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

il sortcomando disadorno produce

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(mettendo le linee che iniziano con i caratteri di spazio e !, #, $, %, e @simboli 1 in vista delle righe che iniziano con lettere e numeri, cioè, caratteri alfanumerici ), ma sort -dproduce

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsè ancora il primo, perché inizia con spazi, ma i caratteri speciali (punteggiatura) vengono ignorati.  17viene prima 42, e foxsi frappone browne jumps, nonostante il fatto che 42e foxhanno dei personaggi davanti a loro che normalmente li sposterebbero prima del 17.
____________
1 in ordine di valori ASCII: spazio = 040, != 041, #= 043, $= 044, %= 045 e @= 0100. Si noti che (ignorando la barra spaziatrice) questo è approssimativamente da sinistra a destra su alcune tastiere.


1
L'ordine nel tuo primo esempio, in cui il testo viene ordinato per primo in base alla punteggiatura, può risultare se la locale in effetti è C (come con LC_ALL = C) ma non in altre locali. L' impostazione internazionale predefinita dipende dalle impostazioni del sistema operativo. Quindi, un disadorno sort dovrebbe essere diverso in molte distribuzioni.
Isaac,
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.