Classifique no Linux por coluna, mantendo outros valores intactos

2
NODE_154_length  847 2997
NODE_154_length 3283    4509
NODE_154_length 4672    5715
NODE_154_length 6977    7768
NODE_29_length  3790    4317
NODE_29_length  4356    4712
NODE_29_length  4356    4712
NODE_29_length  158 319
NODE_29_length  1   97
NODE_29_length  1   96

Eu quero a saída como:

NODE_154_length  847 2997
NODE_154_length 3283    4509
NODE_154_length 4672    5715
NODE_154_length 6977    7768
NODE_29_length  1   97
NODE_29_length  1   96
NODE_29_length  158 319
NODE_29_length  4356    4712
NODE_29_length  4356    4712
NODE_29_length  3790    4317

OR

NODE_29_length   1   97
NODE_29_length  1   96
NODE_29_length  158 319
NODE_154_length 847 2997
NODE_154_length 3283    4509
NODE_29_length  3790    4317
NODE_29_length  4356    4712
NODE_29_length  4356    4712
NODE_154_length 4672    5715
NODE_154_length 6977    7768

sort -k2,2 file Isso classifica toda a coluna 2 e fornece:

NODE_100_length_46867_cov_66.420166  1   50
NODE_104_length_141_cov_120.127663  1   210
NODE_104_length_141_cov_120.127663  1   210
NODE_104_length_141_cov_120.127663  1   225

Isso perturba as coordenadas completas de cada nó.

Se eu tentar sort -k2 file Isso novamente me dará resultados estranhos, não de maneira ordenada.

Não consigo entender como usar a opção -k no Linux. Eu estou usando bash, Linux 13.10

    
por Death Metal 14.02.2014 / 20:10

1 resposta

6

A sintaxe é -k<start>[<flags>][,<end>[<flags>]] (se ,<end> for omitido, esse é o fim da linha).

Isso define a parte da linha a ser classificada como uma chave de classificação.

<start> e <end> referem-se a números de campo. 2 para <start> significa o início do 2º campo, enquanto 2 para <end> significa o fim do 2º campo.

Por padrão, os campos são delimitados pela transição entre um não-branco e um vazio. Por exemplo, em:

NODE_154_length  847 2997

Os campos são:

[NODE_154_length][  847][ 2997]

Realizar sort -k2 , classifica na parte da linha que começa no início do segundo campo e termina no final da linha. Então, acima, em [  847 2997] . sort está fazendo comparações lexicais como padrão.

sort -k2,2 consideraria apenas [  847] para comparação.

Se você quiser fazer uma comparação numérica em uma chave específica, adicione o n <flag> à chave de classificação. Dessa forma,   847 seria convertido em um número. É por isso que -k2,2n e -k2n funcionariam da mesma forma porque as seqüências de caracteres [  847] e [  847 2997] convertem para número 847 .

Então, para obter o seu primeiro resultado, você deseja ordenar o primeiro campo lexicograficamente e, em seguida, (onde os primeiros campos são classificados igualmente) no segundo campo numericamente. Está escrito:

sort -k1,1 -k2,2n

No segundo caso, você deseja classificar o segundo campo numericamente e, quando eles ordenam o mesmo, preservar o pedido original.

É aí que você precisa da opção -s para a classificação estável :

sort -s -k2,2n

(por padrão, onde as chaves ordenam o mesmo, sort recorre a uma comparação léxica da linha inteira; -s desativa isso).

    
por 14.02.2014 / 21:46

Tags