utilice la ordenación GNU para ordenar por una sola clave / evitar la clasificación no deseada de otras claves

9

Tengo un archivo que contiene datos ya ordenados y me gustaría volver a ordenar el archivo de acuerdo con los valores en una clave, sin destruir el orden de los datos en las otras claves.

¿Cómo evito que la ordenación GNU realice la ordenación de filas en función de los valores de las claves que no he especificado, o cómo especifico a la ordenación GNU para ignorar un rango de claves al ordenar?

Archivo data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Rendimiento esperado:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Mando:

sort -k 1,1 <data.txt

Resultado: clasificación no deseada que no solicité:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
Wil
fuente

Respuestas:

21

Necesitas un tipo estable . De man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

verbigracia.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Tenga en cuenta que probablemente también desee una -no --numeric-sortsi su clave es numérica (por ejemplo, puede obtener resultados inesperados al comparar 10 a 2 con el orden de clasificación predeterminado - léxico). En cuyo caso es solo cuestión de hacer:

sort -sn <data.txt

No es necesario extraer el primer campo, ya que la interpretación numérica de toda la línea será la misma que la del primer campo.

conductor de acero
fuente
Leí los documentos, pero la definición adecuada de "estable" evadió mi atención. Gracias por la respuesta rápida, concisa y bien citada. La primera clave de los datos reales es una cadena localizada, por lo que numérico no funcionaría para mí.
Wil
4

Para sortimplementaciones (no GNU) que carecen de una -sopción, siempre puede hacer:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Es decir, anteponga el número de línea para convertirlo en la segunda clave de clasificación y luego elimínelo.

Stéphane Chazelas
fuente