Tengo un archivo csv y me gustaría ordenarlo por prioridad de columna, como "ordenar por". Por ejemplo:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Si esta situación fuera el resultado de un "seleccionar", el "ordenar por" sería el siguiente: ordenar por columna2, columna1, columna3 - el resultado sería:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Me gustaría saber cómo obtener este mismo resultado usando el comando "sort" en Unix.
unix
sorting
csv
sql-order-by
Rafael Orágio
fuente
fuente
Respuestas:
fuente
-n
opción que "comparará según el valor numérico de la cadena" o la-g
opción que "comparará según el valor numérico general". Una comparación de cadenas de valores numéricos obtendrá los números ordenados como1,10,2,20
. Al menos esas son opciones disponibles en mi versión de sort en CentOS. Debe verificar con la página de manual cuáles son las opciones correctas en su versión de sort.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
funcionó para mí.sort --field-separator=';' --key={2,1,3}
. Esto funcionóGNU coreutils 8.4
desde abril de 2016--key={2,1,3}
usa la expansión deSuponga que tiene otra fila
3;10;3
en suunsorted.csv
archivo. Entonces supongo que espera un resultado ordenado numéricamente:y no ordenado alfabéticamente:
Para obtener eso, debes usar
-n
:Vale la pena mencionar que
2,2
debe usarse. Si solo2
se usa,sort
toma la cadena desde el principio del campo 2 hasta el final.2,2
se asegura de que solo2
se utilice el campo .fuente
3;10;3
,3:10:5
,3:10;2
,3;10;3
en ese orden en el archivo de origen, y cuando se utiliza solo-k 2,2
aparece para ordenar en la columna 2 y 3. La página del manual dice"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. En mi caso, la clave anterior (valor = 10) se comparó igual, sin embargo, no especifiqué-k
varias veces. No estoy seguro de si se trata de un comportamiento fiable o relacionado con mi sistema (mac). Sin embargo, en última instancia, no importa, siempre que la clasificación principal sea correcta.-s
un tipo estable que ignora las claves iguales, que aparentemente es más rápido según el hombre.La respuesta de Charlie anterior no funcionó para mí en Cygwin (sort versión 2.0, GNU textutils), lo siguiente sí:
fuente
sort --field-separator=';' -k2 -k1 -k3 test.csv
.. y si alguien siguió la solución 'ordenar' pero ahora quiere obtener más que la entrada única por línea (es decir, el número X superior de entradas únicas), una vez que haya ordenado el archivo usando 'ordenar', puede usar una pequeña aplicación que creé aquí:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
fuente
cat unsorted-file | sort | uniq | head -X
- cuándoX
es el número de primeras filas que desea generar.uniq
en el orden de las tuberías, entre elsort
y elhead
, que da unicidad a todas las filas ordenadas justo antes de la extracción de las filas superiores.