2012-08-13 46 views
12

Tengo un archivo csv con campos delimitados por ";". Hay 8 campos, y quiero ordenar mis datos por las primeras 4 columnas, en orden creciente (primero ordenar por columna 1, luego columna 2, etc.)Bash: ordenar el archivo csv por las primeras 4 columnas

¿Cómo puedo hacer esto desde una línea de comando en Linux?

Lo intenté con Open Office, pero solo me permite seleccionar 3 columnas.

EDITAR: entre los campos en los que quiero ordenar mis datos, tres campos contienen cadenas con valores numéricos, una sola cadena. ¿Cómo puedo especificar esto con el comando sort?

Respuesta

20

Probar:

sort -t\; -k 1,1n -k 2,2n -k 3,3n -k 4,4n test.txt 

por ejemplo:

1;2;100;4 
1;2;3;4 
10;1;2;3 
9;1;2;3 

> sort -t\; -k 1,1n -k 2,2n -k 3,3n -k 4,4n temp3 
1;2;3;4 
1;2;100;4 
9;1;2;3 
10;1;2;3 
+0

Gracias. ¿Cuál es el significado de '1,1n' aquí? –

+0

Ordenando por numérico – Vijay

+0

Oh, está bien. Entonces, digamos que el campo 3 contiene cadenas, haré '-k 3,3d' para ordenar por orden de diccionario, ¿verdad? –

8

sort -k le permitirá definir la clave de ordenación. De man sort:

-k, --key=POS1[,POS2] 
     start a key at POS1 (origin 1), end it at POS2 (default end of line). 

Así

$ sort -t\; -k1,4 

debe hacerlo. Tenga en cuenta que he escapado del punto y coma, de lo contrario, el shell lo interpretará como un final de declaración.

+0

Gracias. ¿'Sort' también permite especificar para cada campo si quiero ordenar numérica o alfabéticamente? (ver mi última edición) –

Cuestiones relacionadas