¿Cómo ordenar UNIX solo por una columna?

47

Sé que la opción -k para la ordenación de Unix nos permite ordenar por una columna específica y todo lo siguiente . Por ejemplo, dado el archivo de entrada:

2 3
2 2
1 2
2 1
1 1

Utilizando sort -n -k 1, obtengo una salida ordenada por la primera columna y luego por la segunda:

1 1
1 2
2 1
2 2
2 3

Sin embargo, quiero mantener el orden de la segunda columna, así:

1 2
1 1
2 3
2 2
2 1

¿Es esto posible con el sortcomando?

ssn
fuente

Respuestas:

65

Prueba esto:

sort -s -n -k 1,1

Los -sdesactiva 'último recurso' clasificación, que clasifica en todo lo que no era parte de una clave especificada.

En -k 1realidad, no significa "este campo y todo lo siguiente" en el contexto de la ordenación numérica, como puede ver si intenta ordenar en la segunda columna. Simplemente estás viendo lazos rotos al ir al resto de la línea. En general, sin embargo, debe especificar -k 1,1ordenar solo en el campo uno.

Cascabel
fuente
Tienes razón. Esto es exactamente lo que necesitaba. ¡Gracias!
¿es posible usar join en la salida de este tipo?
MiNdFrEaK
@MiNdFrEaK: el requisito joines que la entrada se ordene en los campos en los que se está uniendo. Así que seguro, esta salida se ordena en el primer campo, y puede unirse en él.
Cascabel
Tengo 2 archivos, uno con 2 columnas, otro con 1 columna. El segundo archivo se ordena usando sort -u. Ahora la tarea es que necesito unir esta columna con la primera columna del primer archivo, que no está ordenada, entonces, ¿cuál será la sintaxis? ¿esto funcionara? unirse -j 1 archivo2.txt ordenar -s -n -k 1 archivo1.txt?
MiNdFrEaK
1
La -k 1,1(la parte " , 1 ") no funciona mejor para mí. Lo que funciona es -s -k 1, -nsi lo necesitas.
Totor
10

Para ordenar solo en la primera columna, debe hacer:

sort -n -s -k1,1

Del Manual de Administración del Sistema Unix y Linux

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

tidbeck
fuente
No funciona para mí, necesito agregar la -sopción como señaló Cascabel.
Jean Paul
@JeanPaul tiene razón, la documentación -sdice "Esta opción mantiene el orden de registro original de los registros que tienen una clave igual".
tidbeck
2

Ninguna de las respuestas proporcionadas funciona en general para mí.

Ambos sort -s -k 2 file1y sort -n -k1,1haga una ordenación adicional con este archivo:

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

Solo tenía que hacer esto exactamente y terminé usando un bucle de shell. Es posible que esta solución no funcione bien en un archivo muy grande porque es necesario leer todo el archivo para cada valor único en la columna ordenada.

Aquí el archivo se ordena solo 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
usuario680341
fuente
sort -s -k2,2 file1
plhn
La respuesta propuesta por Cascabel está funcionando pero creo que la leíste mal.
Jean Paul