2009-07-26 12 views
13

Ho due macchine Linux, su cui unix sort sembra comportarsi diversamente. Credo di averlo ristretto al trattamento del carattere di sottolineatura.Unix trattamento di ordinamento del carattere di sottolineatura

Se corro sort tmp, dove tmp contiene le seguenti due righe:

aa_d_hh 
aa_dh_ey 

uno uscite della macchina

aa_d_hh 
aa_dh_ey 

(cioè '_' precede 'h'), mentre le altre uscite

aa_dh_ey 
aa_d_hh 

(es. 'H' precede '_'). Ho bisogno che queste macchine si comportino insieme (mentre uso sort -m più avanti, per unire file molto grandi).

Esiste un modo per forzare l'ordinamento in un modo o nell'altro?

Grazie.

+0

provare l'ordinamento --versione su entrambe le macchine .. sono le stesse ?? – sud03r

risposta

15

È possibile impostare LC_COLLATE di ordinamento tradizionale solo per il vostro comando:

env LC_COLLATE=C sort tmp 

Questo non cambierà l'attuale contesto solo quello in cui viene eseguito il comando sort. Si dovrebbe avere lo stesso comportamento con questo.

+0

Quali sono alcune altre scelte valide di LC_COLLATE? Supponiamo che io voglia specificamente spostare il underscore in basso? Che valore avrebbe fatto? –

+0

'LC_COLLATE = en_US.ASCII' è un'altra scelta valida, che ha lo stesso ordinamento per caratteri di sottolineatura come' C'. –

3

L'ordinamento dipende dal valore corrente della variabile di ambiente LC _ COLLATE. Controlla la documentazione locale per "locale", "setlocale", ecc. Imposta LC _ COLLATE su "POSIX" su entrambe le macchine e i risultati devono corrispondere.

+0

non esiste una variabile di ambiente di questo tipo sulla mia macchina, tuttavia l'ordinamento funziona correttamente. – sud03r

0

La differenza è dovuta al numero locale. Utilizzare il comando locale per verificare le impostazioni correnti.

Esistono diverse categorie di locale, ad esempio LC_COLLATE, LC_TIME e LC_MESSAGES. È possibile cambiarli tutti impostando la variabile di ambiente LC_ALL o LANG o solo l'ordine di fascicolazione (sort) impostando la variabile di ambiente LC_COLLATE. Le impostazioni internazionali C o POSIX sono impostazioni locali di base definite dallo standard; altri includono en_US (inglese americano), fr_FR (francese), ecc

0

Ciò è probabilmente causato da una differenza di impostazioni internazionali. Nelle impostazioni internazionali en_US.UTF-8, i caratteri di sottolineatura (_) vengono ordinati dopo lettere e numeri, mentre nello POSIX C locale vengono ordinati dopo lettere maiuscole e numeri, ma prima dei numeri minuscoli.

# won't change LC_COLLATE=C after execution 
$ LC_COLLATE=C sort filename 

È inoltre possibile utilizzare sort --debug di mostrare più informazioni sul comportamento di ordinamento in generale:

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=en_US.UTF-8 sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
foo0bar 
fooabar 
fooAbar 
foo_bar 

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=C sort --debug 
sort: using simple byte comparison 
foo0bar 
fooAbar 
foo_bar 
fooabar 

Come mostrato anche in this answer, è possibile utilizzare la formula di cui sopra per forzare LC_COLLATE=C per un singolo comando, senza modificare l'ambiente della shell:

Problemi correlati