Ordenar numéricamente en un archivo delimitado por comas con Unix


8

Tengo un archivo separado por comas que se ve así:

100,00869184
6492,8361
1234,31
200,04071

Quiero usar sortpara ordenar este archivo numéricamente solo por la primera columna .

Resultado deseado:

100,00869184
200,04071
1234,31
6492,8361

¿Cómo consigo esto usando sort? Parece que las comas están siendo tratadas como miles de separadores en lugar de delimitadores, incluso cuando los llamo así.

Ambos sort -t',' -ny sort -t',' -nk1'dame esto:

1234,31
200,04071
6492,8361
100,00869184

Ordenar por defecto (sin parámetros) o usar sort -t','me da esto:

100,00869184
1234,31
200,04071
6492,8361

Y ordenar por un número sort -nme da esto:

1234,31
200,04071
6492,8361
100,00869184

¿Cómo puedo usar la ordenación para lograr el resultado deseado?

Editado para agregar: Esto es para una operación única para crear una lista ordenada de aproximadamente 7 millones de líneas, por lo que las soluciones alternativas u otros métodos poco ortodoxos son perfectamente aceptables.


los ejemplos que veo aquí parecen mostrar la -topción de tener un espacio entre -tel personaje y el personaje
SeanC

Primer pensamiento: use corte. Selecciona solo una columna en particular, basada en un separador dado. También la respuesta de "Artem Ice" con tr. Me encanta tr. Sin embargo, soy demasiado vago para escribir y probar esto. ¡Salud!
Vorac

Respuestas:


9

Sin duda, esta es una solución sucia, pero descubrí una forma de hacerlo gracias al consejo de @ slhck sobre los entornos locales. Si aparece una mejor respuesta que sería más útil para los demás, ciertamente la aceptaré, ya que esto solo funciona para mi problema específico.

Establecí la configuración regional en español (boliviano) para que las comas se trataran como puntos decimales, luego la clasificación numérica estándar funcionó.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

Ah, ya vería, habría sugerido usar una configuración regional alemana o similar. No puedo pensar en otra cosa en este momento sin poder probarlo o qué herramientas tiene disponibles, ya que esta es una versión bastante rara de Unix.
slhck

@slhck Ese parece ser el quid de la mayoría de los problemas en los que me quedo atrapado en UNIX :) Gracias por su ayuda para llevarme a una solución, independientemente.
dpatchery

6

GNU sorthace esto por defecto:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Versión:

$ gsort --version
sort (GNU coreutils) 8.19

Sin embargo, hay una advertencia: si su clasificación no funciona como se esperaba, entonces localeprobablemente esté configurado en algo diferente a C. ¿Por qué es esto? localedefine la clasificación e interpretación de letras, números, caracteres decimales, etc.

Para verificar esto, solo ingrese localeen una Terminal. ¿Está LC_NUMERICconfigurado para en_US.UTF-8, tal vez? Esto explicaría el orden de clasificación incorrecto. Ajústelo de nuevo a C:

export LC_NUMERIC=C

Luego, intente su sortcomando nuevamente. Si desea establecer su global localea C, haga esto con:

export LC_ALL=C

No tengo acceso a GNU en mi entorno. ¿Es algo que podría obtener fácilmente y luego eliminar cuando haya terminado? HMU en el chat si alguien quisiera ayudarme a hacer esto ... Soy todo un novato en UNIX.
dpatchery

Estoy bastante seguro de que es solo un localeproblema. Pero, ¿qué hay sort --versionpara ti, en realidad?
slhck

sort --version me da un argumento ilegal. --Los comandos tampoco me han funcionado en el pasado. Revisé la página del manual y no hay una versión explícitamente llamada, pero sí menciona "HP-UX 11i Versión 2: agosto de 2003" si eso ayuda. Mi LC_NUMERIC está configurado en "C".
dpatchery

La configuración regional alemana, por ejemplo, se usaría ,como separador decimal. Sin embargo, nunca he usado HP-UX.
slhck

1

Intente agregar la -gopción que se supone que realiza la ordenación numérica.

Tratar:

sort -t',' -g <whatever>

¿No es la -nordenación numérica? -g me da una opción ilegal.
dpatchery

-ges la general-numeric-sortopción y debería estar disponible en cualquier versión reciente de sort. @dpatchery
slhck

Esto está en mi lugar de trabajo, así que casi definitivamente no tengo una versión reciente :)
dpatchery

0

Reemplace el delímetro:

cat commafile | tr , " " | sort -n 

- debería ayudarte.

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.