Como obtenho a classificação para mostrar os resultados em ordem de classificação semelhante a humana?

6

Executando o comando sort no primeiro campo de um arquivo sort -k1,1 file.txt desta forma:

1,2,3
2,1,1
10,2,1

me dá:

1,2,3
10,2,1
2,1,1

em vez de:

1,2,3
2,1,1
10,2,1

Eu não quero 10 antes de 2. Existe alguma maneira de fazer isso?

Desculpe pelo estranho título da pergunta. Eu não sei como colocar isso em termos técnicos.

    
por user110327 04.05.2017 / 12:56

2 respostas

10

Como explicado em man sort :

   -n, --numeric-sort
          compare according to string numerical value

Então você quer:

$ sort -nk1,1 file
1,2,3
2,1,1
10,2,1

Observe também que, por padrão, os campos são delimitados em branco, portanto, essas linhas nesse arquivo têm apenas um campo. Por exemplo, o primeiro campo da primeira linha é 1,2,3 , não 1 . Você precisaria adicionar -t , para ,-separated fields:

sort -t, -nk1,1 file

Com -n , sort considera apenas a sequência de caracteres que formam um número válido no início da chave de classificação (ignorando espaços em branco à esquerda). Para essa primeira linha, sem -t, , dependendo da implementação sort e da localidade, 1,2,3 será considerado como 1 ou 1.2 (quando o separador decimal do usuário for , ) ou 123 (quando o separador de milhar do usuário é , e sort ignora qualquer ocorrência dele).

    
por 04.05.2017 / 13:01
2

Deixando isso para qualquer um que se deparar com isso: sort -V -k1,1 file.txt deve funcionar.

    
por 04.05.2017 / 13:02