Uma especificação de chave como -k2 significa considerar todos os campos de 2 até o final da linha. Então, Villamor 44 acaba antes de Villamor 50 . Como esses dois não são iguais, a primeira comparação em sort -k2 -k1 é suficiente para discriminar essas duas linhas, e a segunda chave de classificação -k1 não é invocada. Se os dois Villamors tivessem a mesma idade, -k1 teria feito com que eles fossem classificados pelo primeiro nome.
Para classificar por uma única coluna, use -k2,2 como especificação de chave. Isso significa usar os campos de 2 a 2, ou seja, apenas o segundo campo.
sort -k2 -k3 <people.txt é redundante: é equivalente a sort -k2 <people.txt . Para classificar por sobrenomes, depois os primeiros nomes e, em seguida, idade, execute o seguinte comando:
sort -k2,2 -k1,1 <people.txt
ou equivalentemente sort -k2,2 -k1 <people.txt , pois existem apenas esses três campos e os separadores são os mesmos. De fato, você obterá o mesmo efeito de sort -k2,2 <people.txt , porque sort usa a linha inteira como último recurso quando todas as chaves em um subconjunto de linhas são idênticas.
Observe também que o separador de campo padrão é a transição entre um não-branco e um vazio, então as chaves incluirão os espaços em branco à esquerda (no seu exemplo, para a primeira linha, a primeira será "Emily" , mas a segunda chave " Bedford" . Adicione a opção -b para remover esses espaços em branco:
sort -b -k2,2 -k1,1
Também pode ser feito em uma base por chave, adicionando o sinal b no final da especificação de início de chave:
sort -k2b,2 -k1,1 <people.txt
Mas é importante ter em mente: assim que você adicionar um sinalizador à especificação de chave, os sinalizadores globais (como -n , -r ...) não serão mais aplicados a eles, por isso é melhor evitar misturar sinalizadores por chave e sinalizadores globais.