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.