2011-05-06 2 views
12

que desea ordenar un archivo de texto a través de Linux sort, que se ve asíespecie no clasificar como se esperaba (el espacio y la configuración regional)

v 1006 
v10 1 
v 1011 

yo esperaría resultado como este:

v 1006 
v 1011 
v10 1 

Sin embargo , usando sort, incluso con todo tipo de opciones, la línea v10 1 está todavía en el medio. ¿Por qué? Entiendo que v10 1 está arriba en la parte inferior (dependiendo de si el carácter de espacio es más pequeño o más grande que 1), pero ¿por qué se mantiene en el medio?

Respuesta

14

Utiliza la configuración regional del sistema para determinar el orden de clasificación de las letras. Supongo que con su configuración regional, ignora el espacio en blanco.

utilidades
$ cat foo.txt 
v 1006 
v10 1 
v 1011 
$ LC_ALL=C sort foo.txt 
v 1006 
v 1011 
v10 1 
$ LC_ALL=en_US.utf8 sort foo.txt 
v 1006 
v10 1 
v 1011 
+1

sólo un pequeño comentario, no es necesario poner el '; 'en' LC_ALL = en_US.utf8; ordenar foo.txt'. Sin embargo, hay una diferencia en el comportamiento. Si ejecuta 'SOME_VAR = foo some_command parameters' está ejecutando some_command con sus parámetros, y con el env var SOME_VAR siendo igual a foo, pero solo para este comando. Si después de regresar al depósito, 'echo $ SOME_VAR', tendrá el valor original, no' foo' –

+0

Oh. OK, lo entiendo ahora. Pero ... ¿cuál es el PUNTO al ignorar los espacios en blanco? –

+0

¿Por qué -k parece respetar el espacio en blanco en LC_ALL = en_US.utf8? p. LC_ALL = en_US.utf8 sort -k1,1 foo.txt da el mismo comportamiento que LC_ALL = C sort foo.txt – Featherlegs

4

Su ubicación influye en cómo se ordenan las líneas. Por ejemplo me sale esto con mi localización actual:

% echo -e "v 1006\nv10 1\nv 1011" | sort 
v 1006 
v10 1 
v 1011 

Pero con C locale me sale esto:

% echo -e "v 1006\nv10 1\nv 1011" | LC_ALL=C sort 
v 1006 
v 1011 
v10 1 

No estoy seguro de por qué se comporta de esa manera realmente. LC_ALL=C es más o menos equivalente a desactivar todo el procesamiento inesperado y regresar a las operaciones de nivel de byte (sí, me estoy saltando los detalles).

Sin embargo, por qué son diferentes las configuraciones de configuración regional omitir el espacio es más difícil de explicar. Si alguien puede explicar que sería bueno :)

Cuestiones relacionadas