Ordena unix alfabeticamente e numericamente, não funcionando como eu pretendia

2

Desculpe se esta é uma pergunta duplicada, mas não encontrei a resposta que estou procurando aqui ou na documentação.

Eu tenho um arquivo que se parece 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 #) só importa em termos de chr #, significando que todos chr1 devem ser primeiro, depois chr2, depois chr3, etc., mas eu gostaria de classificar esses substrings numericamente em grupos, como mostrado pela saída desejada acima. Então, eu gostaria de saber como classificar alfabeticamente no caso da primeira coluna, e então manter essa ordem (chr1- > chrN), classificar cada parte dos dados numericamente.

Peço desculpas se meu texto não for o melhor para esse problema ou se for uma duplicata. Tentando

sort -k1,1 -nk2

classifica corretamente numericamente, mas não mantém a primeira classificação intacta (embaralha a primeira coluna e coloca juntas todas as linhas, com as colunas 2 e 3 sendo como:

50   100

Estou usando o Mac OS X.

EDIT: Eu quero mudar alguns dos exemplos na primeira coluna para mostrar mais do 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.

Eu gostaria essencialmente de ordenar cada subgrupo (neste caso, chr1, chr2, etc) pela coluna 2 iterativamente. Eu percebo que isso pode ser feito facilmente fazendo um grep para cada um e, em seguida, classificando-o na coluna 2, mas eu gostaria de saber se o comando sort ou another unix poderia realizar isso sozinho.

    
por implication 29.09.2016 / 22:37

2 respostas

0

sort -k1,1 -nk2 é o mesmo que sort -k1,1 -n -k2 , o mesmo que sort -n -k1,1 -k2 , como na classificação numérica está ativada globalmente, para todas as chaves.

Para ordenar a chave 2 nd apenas numericamente, você precisa adicionar n a essa descrição de chave de ordenação como em:

sort -k1,1 -k2n

Ou:

sort -k1,1 -k2,2n

Com n e com o separador de campos padrão 2 é o mesmo que 2,2 . 2 seria a parte da linha a partir do segundo campo, mas quando interpretada como um número, é o mesmo que o segundo campo sozinho ( 2,2 ).

Aqui, você também pode ordenar numericamente o número depois de chr e, em seguida, alfabeticamente no restante do primeiro campo e depois numericamente no segundo campo com:

sort -k1.4n -k1,1 -k2n
    
por 30.09.2016 / 09:24
0

classificando alfabeticamente no primeiro campo, e numericamente no segundo, dá (na sua saída, - 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
    
por 30.09.2016 / 15:21