Comportamiento incorrecto del comando de clasificación?


14

Traté de ordenar el contenido de un archivo en el escritorio de Ubuntu 14.04 (Trusty Tahr). En mi caso, el resultado esperado debería ser el mismo que el contenido original, pero el resultado real no lo es. ¿Por qué?

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

44
Te entrego un pequeño trofeo de premio por tu uso inútilcat .
David Foerster

3
El comentario de @DavidFoerster es una forma divertida de señalar que puedes reemplazarlo cat test.txt | sortpor sort test.txt:)
Volker Siegel

@VolkerSiegel: Cierto, aunque hay formulaciones útiles catpara comenzar. Por ejemplo cat FILE | grep dev | sort, solo se mostrarán líneas con "dev" en ellas (en orden). El uso sort FILE | grep devproduce la misma salida pero de color.
AlainD

Respuestas:


17

Puede usar LC_ALLvariable, configúrelo LC_ALL=Cantes de llamarsort

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

Lea esta respuesta, si quiere saber qué es esto mágicamente LC_ALL=C. Aquí hay un breve resumen:

La configuración regional de C es una configuración regional especial que debe ser la configuración regional más simple. También podría decir que si bien las otras configuraciones regionales son para humanos, la configuración regional C es para computadoras. En la configuración regional C, los caracteres son bytes individuales, el juego de caracteres es ASCII, el orden de clasificación se basa en los valores de bytes.

Además, como señaló @KenMollerup, cite de 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.

Entonces, cuando use ordenar con LC_ALL=C, ordene los símbolos de comparación por byte. De sortlo contrario , ignorará todos los caracteres no alfanuméricos.


Lo siento, no vi esto, ¡reaccioné al comentario!
Ken Mollerup

@KenMollerup gracias por señalar man sort. No me di cuenta
c0rp

8

La ordenación usa la ordenación alfabética y numérica, igual que nosotros, los caracteres especiales como + - <> ... se ignoran, los números se tratan numéricamente, así que 1, 2, 3 ... viene antes del 11, 12 1066 1104 - ¡mira!

Entonces su lista se ve como: aa, ab, ab, ac, ac


¿Hay alguna opción para ordenar, de modo que no ignore los caracteres especiales, de modo que test.txt clasifique de la manera deseada?
Doug Smythies

66
Vea esto en man sort: *** ADVERTENCIA *** La configuración regional especificada por el entorno afecta el orden de clasificación. Establezca LC_ALL = C para obtener el orden de clasificación tradicional que utiliza valores de bytes nativos.
Ken Mollerup

@KenMollerup, agregue más información a su respuesta. Agregar cita de man sort, agregar ejemplos.
c0rp

Sí, pero fui demasiado lento, vea la respuesta de c0rp a continuación.
Ken Mollerup
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.