Por que classificar -k4nr e classificar -k 4 -n -r fornece resultados diferentes? [duplicado]

0

Aqui está o meu arquivo, a primeira linha não faz parte dela (aquela com Fname .. )

Fname Lname Age Children 
John  Doe   61  2
Mary  Jane  32  5
Delta Cross 30  5
Sui   Ace   24  1

Eu quero classificar este arquivo com base no número de filhos . Deve ser classificado da maioria das crianças para o menor número de crianças.

Aqui está o meu comando: sort -k 4 -n -r file.txt , que diz classificar com base na quarta coluna, classificação numérica e reversa. Isso produz:

Mary  Jane  32  5
Delta Cross 30  5
John  Doe   61  2
Sui   Ace   24  1

A maneira que meu texto faz é sort -k4nr file.txt . Eu tenho duas perguntas sobre isso:

Primeiramente, pensei que nossas opções devem ser separadas por espaços (não unidas)? Não é este o caso para classificar, ou não é o caso de qualquer um dos comandos?

Em segundo lugar, ao fazer isso, recebo o pedido "certo", mas Delta é o primeiro:

Delta Cross 30  5
Mary  Jane  32  5
John  Doe   61  2
Sui   Ace   24  1

Por que isso acontece?

    
por K Split X 15.05.2018 / 02:14

2 respostas

2

  1. Os utilitários GNU geralmente têm a capacidade de analisar opções de uma única letra como um único grupo liderado por hífens, de modo que -n -r também possa ser enviado como -nr ; este é apenas o caso quando ainda não existe uma opção nr que possa ser confundida.

  2. O uso de -k 4 -n -r indica a classificação que você deseja classificar no campo 4 e deseja que todas as linhas do arquivo sejam classificadas em ordem numérica inversa. Uma vez ordenada a classificação das duas linhas de 5 -key em seu valor de chave igual, ele classifica a linha inteira, descrita pelo página do manual :

    Finally, as a last resort when all keys compare equal, sort compares entire lines as if no ordering options other than --reverse (-r) were specified.

... é por isso que Mary vem antes da Delta.

Quando você usa -k4nr , digita para usar o campo 4 e classifica apenas esse campo em ordem numérica reversa. Quando a classificação é feita comparando 5 com 5, ele classifica essas duas linhas (inteiras) na ordem normal do dicionário (já que não há uma opção global r everse aqui), e assim Delta vem antes de Mary.

    
por 15.05.2018 / 02:46
0

Dependendo do comando, você pode agrupar as opções. sort é um desses, mas também pode alterar a saída que eu vou chegar abaixo.

Isso também vale para rm

rm -rf directory faz o mesmo que rm -r -f directory

Quanto ao motivo pelo qual seus dois comandos dão ordens diferentes, seu primeiro comando classifica usando a quarta coluna como a chave via -k 4 e depois passa para a classificação numérica e depois a inverte. (Na verdade, você não precisa do n porque a quarta coluna contém apenas números de qualquer forma, então sort -k 4 -r fornecerá a mesma saída). Em seguida, ordena o restante das colunas na ordem inversa.

Seu segundo comando os agrupa e depois opera classificando apenas a quarta coluna por ordem numérica reversa. Ambos têm o mesmo valor de chave para a quarta coluna, então ela passa para a classificação em ordem alfabética para as duas primeiras colunas.

Se você alterar esta linha:

Delta Cross 30 5

para

Zelta Cross 30 5

então a linha que começa com Mary virá primeiro para o segundo comando.

    
por 15.05.2018 / 02:51