Classifique o unix em ordem alfabética e numérica, não funcionando como pretendido

Classifique o unix em ordem alfabética e numérica, não funcionando como pretendido

Desculpe se esta é uma pergunta duplicada, mas não consegui encontrar a resposta que procuro aqui ou na documentação.

Eu tenho um arquivo parecido com o seguinte:

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

A saída desejada é semelhante 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

O padrão no início (por exemplo, chr#_oligo#) importa apenas em termos de chr#, o que significa que todos os chr1 devem ser primeiro, depois chr2, depois chr3, etc., mas eu gostaria de classificar essas substrings numericamente em grupos como mostrado pela saída desejada acima. Então, gostaria de saber como ordenar em ordem alfabética no caso da primeira coluna e, mantendo essa ordem (chr1->chrN), ordenar numericamente cada pedaço de dados.

Peço desculpas se minha redação não for a melhor para este problema ou se for duplicada. Tentando

sort -k1,1 -nk2

ordena numericamente corretamente, mas não mantém a primeira classificação intacta (desordena a primeira coluna e junta todas as linhas com as colunas 2 e 3 sendo assim:

50   100

Estou usando o Mac OS X.

EDIT: Quero alterar alguns dos exemplos da primeira coluna para mostrar mais o que estou procurando. gsort -V funcionou muito bem se o nome na primeira coluna estiver em ordem numérica, mas no meu conjunto de dados nem sempre é o caso.

Gostaria essencialmente de classificar cada subgrupo (neste caso, chr1, chr2, etc) pela coluna 2 iterativamente. Sei que isso pode ser feito facilmente executando um grep para cada um e depois classificando-o na coluna 2, mas gostaria de saber se o sort ou outro comando unix poderia fazer isso sozinho.

Responder1

sort -k1,1 -nk2é o mesmo que sort -k1,1 -n -k2, igual a sort -n -k1,1 -k2, como nonuméricoa classificação está ativada globalmente, para todas as chaves.

Para classificar a segunda chave apenas numericamente, você precisa adicionar na essa descrição da chave de classificação como em:

sort -k1,1 -k2n

Ou:

sort -k1,1 -k2,2n

Com ne com o separador de campos padrão 2é o mesmo que 2,2antes. 2seria a parte da linha que começa no segundo campo, mas quando interpretado como um número, é igual ao segundo campo sozinho ( 2,2).

Aqui, você também pode classificar numericamente o número seguinte chre, em seguida, em ordem alfabética no restante do primeiro campo e, em seguida, numericamente no segundo campo com:

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

Responder2

ordenando alfabeticamente no primeiro campo e numericamente no segundo dá (na sua saída, - chr4_oligo95 é 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

informação relacionada