sort
proporciona dos tipos de ordenación numérica. Esto es de la página del manual:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
¿Cual es la diferencia?
sort
no es laman
página sino lainfo
página (info sort
).Respuestas:
La ordenación numérica general compara los números como flotantes, esto permite la notación científica, por ejemplo, 1.234E10 pero es más lento y está sujeto a errores de redondeo (1.2345678 podría venir después de 1.2345679), la ordenación numérica es solo una ordenación alfabética regular que sabe que 10 viene después de 9.
Ver http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
fuente
-k3.2n
o-k3.2g
, está ordenandoR10
antesR2
. El tipo es lexicográfico, no numérico. Espero que trate el campo desde el segundo carácter en adelante como un número.sort
especificaciones clave. son verdaderamente bizantinos - el corto es: el espacios en blanco que preceden al campo se consideran parte del campo , por lo que char. El índice 1 apunta al (primer) espacio en blanco que precede al campo, no al primer carácter real del campo. Sufijo el char. index withb
para solucionar este problema, es decir:-k 3.2bn,3
(tenga en cuenta que la opción global no funciona en este caso). También tenga en cuenta lo agregado , que garantiza que solo se use el tercer campo; sin ese segundo índice de campo, se usa el resto de la línea completa .-b
,3
Debe tener cuidado con su localidad. Por ejemplo, podría intentar ordenar un número flotante (como 2.2) mientras que su configuración regional podría esperar el uso de una coma (como 2,2).
Como se informó en este foro , es posible que obtenga resultados incorrectos al utilizar los indicadores -no -g.
En mi caso uso:
para ordenar la sexta columna que contiene:
para obtener
fuente
-n
reconocer la coma como un separador de miles: "1,000" se trata de la misma manera que "1".sort
usa la lógica del prefijo más largo : se usa la parte más larga de la línea / tecla que reconoce como un número; en una configuración regional que utiliza.
como carácter de base, dejará de leer en,
.LC_ALL=C
hecho, es la opción más sólida ; sin embargo, siLC_ALL
no se establece la apuesta,LANG=C
también funcionará.LANG=C sort -k 6,6n file
es más simple y también localiza el efecto de establecer la variable de entornoLANG
en el comando específico.Además de la respuesta aceptada que menciona
-g
permitir la notación científica , quiero mostrar la parte que más probablemente causa un comportamiento indeseable.Con
-g
:Mire las
zoo
tres cosas importantes aquí:La línea comienza con
NAN
(por ejemplo,Nana
ynani lol
) o-INF
(un guión, no--INF
) se mueve al final pero antes de los dígitos. Mientras seINF
mueve al último dígito posterior porque significa infinito .Los
NAN
,INF
y no-INF
distinguen entre mayúsculas y minúsculas .Las líneas siempre se ignoran los espacios en blanco a cada lado de
NAN
,INF
,-INF
(sin tener en cuentaLC_CTYPE
). Otros alfabéticos pueden ignorar los espacios en blanco de cualquier lado dependiendo de la configuración regionalLC_COLLATE
(por ejemplo,LC_COLLATE=fr_FR.UTF-8
ignorar peroLC_COLLATE=us_EN.UTF-8
no ignorar).Entonces, si está ordenando alfanuméricos arbitrarios , probablemente no lo desee
-g
. Si realmente necesita una comparación de notación científica-g
, probablemente desee extraer datos alfabéticos y numéricos y hacer la comparación por separado .Si solo necesita una
1, -1
clasificación de números ordinarios (por ejemplo ), y cree que0x/E/+ sorting
no es importante, use lo-n
suficiente:O
-g
bien-n
, tenga en cuenta el efecto local . Es posible que desee especificarLC_NUMERIC
comous_EN.UTF-8
para evitar la clasificación de fr_FR.UTF-8-
con un número flotante fallido :Con
LC_NUMERIC=en_US.UTF-8
:O
LC_NUMERIC=us_EN.UTF-8
para agrupar+|-|space
conalpha
:Probablemente desee especificar
locale
al usarsort
si desea escribir un script portátil.fuente