Ordenar archivos por primera y luego segunda columna

13

¿Cómo puedo manipular un archivo de texto separado por tabulaciones de dos columnas ordenando por el primer elemento de la segunda columna (solo si el primer elemento de la columna es el mismo)?

Ejemplo:

Archivo de entrada 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Salida esperada: archivo 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10
dovah
fuente

Respuestas:

22

Use sortla -kopción de ordenar por (múltiples) columnas a la vez:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1se ordena por la primera columna primero, luego -k2npor la segunda¹ numéricamente cuando se vincula la primera columna, de modo que obtiene su salida en el orden que desee: ordenando por el primer elemento de la segunda columna, solo si el primer elemento de la columna es el mismo.

Al ordenar numéricamente, solo examinará el campo hasta que deje de ser un número, por lo que le ofrece una comparación del primer elemento.

Cuando las dos teclas comparan lo mismo, sortcompara las líneas completas léxicamente como una comparación de último recurso. Por ejemplo, en A 1-10vs A 1-2, las primeras claves son idénticas ( Acadena), y la segunda clave también (ambas se tratan como el número 1), por lo que luego se sortcompara A 1-10vs A 1-2léxicamente y la última es mayor como se 2ordena después 1. La implementación de GNU sorttiene una -Vopción o Vindicador de clave para realizar una clasificación de versiones , que es como una comparación léxica, excepto que las secuencias de dígitos decimales dentro de las cadenas se comparan numéricamente, por sort -k1,1 -k2Vlo que se ordenarían A 1-10después A 1-2porque 10un número es mayor que 2.


¹ técnicamente, -k2significa la porción de la línea que comienza con el segundo campo (después de la primera transición de un espacio en blanco) y termina al final de la línea, pero con la nbandera, que equivale a -k2,2nsolo la parte inicial eso constituye un número se considera.

Michael Homer
fuente