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).