Ordene Unix alfabéticamente y luego numéricamente, no funciona como pretendía

Ordene Unix alfabéticamente y luego numéricamente, no funciona como pretendía

Lo siento si esta es una pregunta duplicada, pero no pude encontrar la respuesta que busco aquí o en la documentación.

Tengo un archivo que se parece al siguiente:

chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr4_oligo95    50  100
chr5_oligo1 50  100
chr4_oligo4 150 200

El resultado deseado se parece a:

chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo95    50  100
chr4_oligo4 150 200
chr5_oligo1 50  100

El patrón al principio (por ejemplo, chr#_oligo#) solo importa en términos de chr#, lo que significa que todo chr1 debe ser primero, luego chr2, luego chr3, etc., pero me gustaría ordenar esas subcadenas numéricamente en grupos como mostrado por el resultado deseado arriba. Entonces, me gustaría saber cómo ordenar alfabéticamente en el caso de la primera columna y luego, manteniendo ese orden (chr1->chrN), ordenar cada fragmento de datos numéricamente.

Pido disculpas si mi redacción no es la mejor para este tema o si está duplicada. Intentando

sort -k1,1 -nk2

ordena numéricamente correctamente, pero no mantiene intacta la primera clasificación (confunde la primera columna y junta todas las líneas con las columnas 2 y 3 como:

50   100

Estoy usando Mac OS X.

EDITAR: Quiero cambiar algunos de los ejemplos en la primera columna para mostrar más de lo que estoy buscando. gsort -V funcionó muy bien si el nombre en la primera columna está en orden numérico, pero en mi conjunto de datos, no siempre es así.

Básicamente, me gustaría ordenar cada subgrupo (en este caso, chr1, chr2, etc.) por la columna 2 de forma iterativa. Me doy cuenta de que esto se puede hacer fácilmente haciendo un grep para cada uno y luego ordenándolo en la columna 2, pero me gustaría saber si sort u otro comando de Unix podría lograr esto por sí solo.

Respuesta1

sort -k1,1 -nk2es lo mismo que sort -k1,1 -n -k2, igual que sort -n -k1,1 -k2, como en elnuméricoLa clasificación está activada globalmente, para todas las claves.

Para ordenar la segunda clave solo numéricamente, debe agregar na esa clave de clasificación una descripción como en:

sort -k1,1 -k2n

O:

sort -k1,1 -k2,2n

Con ny con el separador de campos predeterminado 2es lo mismo 2,2. 2sería la parte de la línea que comienza desde el segundo campo, pero cuando se interpreta como un número, es lo mismo que el segundo campo solo ( 2,2).

Aquí, también puede ordenar numéricamente el número que está después chry luego alfabéticamente el resto del primer campo y luego numéricamente el segundo campo con:

sort -k1.4n -k1,1 -k2n

Respuesta2

ordenar alfabéticamente en el primer campo y numéricamente en el segundo da (en su salida, - chr4_oligo95 está antes de ch4_oligo4)

sort -k1,1 -k2n,2n file 
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo4 150 200
chr4_oligo95    50  100
chr5_oligo1 50  100

información relacionada