Estoy tratando de ordenar algunos datos simples delimitados por tuberías. Sin embargo, ordenar no es realmente ordenar. Mueve mi fila de encabezado hacia abajo, pero mis dos filas que comienzan con 241 se dividen en una fila que comienza con 24.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Los encabezados de las columnas se están moviendo al final del archivo, por lo que ordenar los procesa claramente. Pero, los valores reales no se ordenan como era de esperar.
En este caso trabajé alrededor con
sort sort_fail.csv --field-separator='|' -k1,1
Pero, siento que eso no debería ser necesario. ¿Por qué ordenar no es ordenar?
LC_COLLATE=C sort
. Dependiendo de lo que espere, también puede necesitarLC_COLLATE=C sort -t'|' -n
csvsort
desdecsvkit
, que trata los valores correctamente citado.Respuestas:
sort
es compatible con la configuración regional, por lo que dependiendo de su configuración LC_COLLATE (que se hereda de LANG) puede obtener resultados diferentes:Esto puede causar problemas en los scripts, ya que es posible que no sepa qué configuración regional de llamada está configurada y, por lo tanto, puede obtener resultados diferentes.
No es raro que los scripts fuercen la configuración necesaria
p.ej
Ahora lo que es interesante, aquí, es que el
|
personaje se ve extraño.Pero eso se debe a que la regla predeterminada para en_US, que deriva de ISO, dice
Lo que significa que el
|
personaje se ignora y el orden de clasificación sería como si el personaje no existiera.Y eso coincide con la clasificación "inesperada" que estás viendo.
Las soluciones alternativas son usar
-n
(para forzar ordenamientos numéricos), o usar el separador de campo (como lo hizo) o usar laC
configuración regional.fuente
--debug
opción, que indica la clave (subrayada) utilizada para compararsort
está usando toda la línea en lugar de detenerse en los caracteres que suponemos.Lo que me irrita es que
24
no se mueve de su lugar entre los dos241
. El segundo campo comienza con a1
. Intentando el tipo con un líder4
en el segundo campo,24
se mueve hacia abajo, por lo que sospecho quesort
simplemente ignora a|
menos que se indique lo contrario. Intentasort -n
...fuente
-n, --numeric-sort compare según el valor numérico de la cadena
Sin el -n, 210 por texto está por delante de 23, ya que va personaje mi personaje.
fuente