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 n
a essa descrição da chave de classificaçã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
antes. 2
seria 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 chr
e, 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