2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

¿Cómo ordenar en UNIX por una sola columna?

Sé que la opción -k para el Unix sort nos permite ordenar por una columna específica y todas las siguientes. Por ejemplo, dado el archivo de entrada

2 3
2 2
1 2
2 1
1 1

Usando sort -n -k 1, obtengo una salida ordenada por la 1ª columna y luego por la 2ª:

1 1
1 2
2 1
2 2
2 3

Sin embargo, quiero mantener la ordenación de la 2ª columna, así

1 2
1 1
2 3
2 2
2 1

¿Es esto posible con el comando sort?

Respuestas (3)

68
68
68
2009-08-31 16:28:27 +0000

Pruebe esto:

sort -s -n -k 1,1

El -s desactiva la ordenación de “último recurso”, que ordena en todo lo que no era parte de una clave especificada.

El -k 1 no significa realmente “este campo y todos los siguientes” en el contexto de la ordenación numérica, como puede ver si intenta ordenar en la segunda columna. Simplemente, se rompen los empates al pasar al resto de la línea. En general, sin embargo, necesita especificar -k 1,1 para ordenar sólo en el campo uno.

10
10
10
2012-10-16 13:59:28 +0000

Para ordenar sólo en la primera columna debe hacer:

sort -n -s -k1,1

De Unix and Linux System Administration Handbook

sort acepta la especificación de clave -k3 (en lugar de -k3,3), pero probablemente no hace lo que usted espera. Sin el número de campo final, la clave de ordenación continúa hasta el final de la línea

2
2
2
2016-12-30 17:47:12 +0000

Ninguna de las respuestas proporcionadas me funciona en general.

Tanto sort -s -k 2 file1 como sort -n -k1,1 hacen una ordenación adicional con este archivo:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Tuve que hacer exactamente esto y terminé usando un bucle de shell. Esta solución podría no funcionar bien en un archivo muy grande porque se necesita leer todo el archivo para cada valor único en la columna ordenada.

Aquí el archivo está ordenado sólo en la columna 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7