2009-07-26 14 views
13

Tengo dos máquinas de Linux, en las que la clasificación de Unix parece comportarse de manera diferente. Creo que lo he reducido al tratamiento del personaje de guión bajo.Tratamiento de clasificación de Unix del carácter de subrayado

Si funciono sort tmp, donde tmp contiene las dos líneas siguientes:

aa_d_hh 
aa_dh_ey 

uno salidas de máquina

aa_d_hh 
aa_dh_ey 

(es decir, '_' precede 'h'), mientras que las otras salidas

aa_dh_ey 
aa_d_hh 

(es decir, 'h' precede a '_'). Necesito que estas máquinas se comporten juntas (como utilizo sort -m later, para fusionar archivos muy grandes).

¿Hay alguna manera en que pueda obligar a la ordenación a comportarse de una forma u otra?

Gracias.

+0

intente sort --version en ambas máquinas ... ¿son lo mismo? – sud03r

Respuesta

15

Puede establecer LC_COLLATE al orden de clasificación tradicional sólo para su comando:

env LC_COLLATE=C sort tmp 

Esto no va a cambiar el entorno actual apenas el uno en el que se ejecuta el comando de ordenación Debe tener el mismo comportamiento con esto.

+0

¿Cuáles son algunas otras opciones válidas de LC_COLLATE? Supongamos que específicamente quiero mover el subrayado inferior? ¿Qué valor haría eso? –

+0

'LC_COLLATE = en_US.ASCII' es otra opción válida, que tiene el mismo orden de caracteres para caracteres de subrayado como' C'. –

3

el orden de clasificación depende del valor actual de la variable de entorno LC _ COLLATE. Revise su documentación local para 'locale', 'setlocale', etc. Configure LC _ COLLATE en 'POSIX' en ambas máquinas, y los resultados deben coincidir.

+0

no existe dicha variable de entorno en mi máquina, pero la ordenación funciona bien. – sud03r

0

La diferencia se debe a su locale. Use el comando locale para verificar la configuración actual.

Existen varias categorías de configuración regional diferentes, como LC_COLLATE, LC_TIME y LC_MESSAGES. Puede cambiarlos todos configurando la variable de entorno LC_ALL o LANG, o solo el orden de intercalación (clasificación) configurando la variable de entorno LC_COLLATE. La configuración regional C o POSIX es una configuración básica definida por el estándar; otros incluyen en_US (EE.UU. Inglés), fr_FR (francés), etc.

0

Esto probablemente se deba a una diferencia en la configuración regional. En la configuración regional en_US.UTF-8, los caracteres de subrayado (_) ordenan letras y números, mientras que en POSIX C locale ordenan letras y números mayúsculos, pero antes de números minúsculos.

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

También puede utilizar sort --debug para mostrar más información sobre el comportamiento de la separación en general:

$ (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 

Como también se muestra en la this answer, puede utilizar la fórmula anterior para forzar LC_COLLATE=C para un solo comando, sin modificar su entorno de shell:

Cuestiones relacionadas