Ordenar comando em mais de um campo

1

Eu tenho um arquivo com conteúdo

192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23

Quando dei

$ sort -h -t. -k3,4 sort_test.txt 
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56

Não foi possível entender por que o 10.1.1.23 vem antes do 10.1.1.3. Eu pensei, uma vez que dois campos são usados para comparação, o segundo campo é usado quando há um empate e deve funcionar como ordenação normal.

    
por user3539 12.02.2015 / 04:13

4 respostas

2

Isso classifica .23 após .3 :

$ sort -h -t. -k3,3 -k4,4 sort_test.txt 
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56
    
por 12.02.2015 / 04:24
1

No caso, é melhor usar a opção -n em vez de -h . Mas a principal coisa é possível expansão de . Para minha opinião, algumas versões de sort operam -t argumentos como regexp , então, para ter certeza, eu me ofereço para escapar de .

sort -nt\. -k3,4 sort_test.txt 
    
por 12.02.2015 / 09:33
0

Uma compreensão de por que o tipo está se comportando como "estranho"

desde que você esteja classificando da chave 3 para a chave 4, a ordenação irá ignorar todos os outros campos

 sort -h -t. -k3,4 sort_test.txt

resultará em

10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56

A extração das chaves 3 e 4 dos seus resultados explicará por que os lugares de classificação 192.168.1.3 acima de 10.1.1.3

1.1
1.2
1.2------>192.168.1.2
1.23------> 10.1.1.23
1.3------>10.1.1.3
1.3
1.4
1.43
1.56

Por isso, vemos a razão pela qual o comportamento se comporta da maneira que deveria ... escolher as chaves de 1 a 4, portanto, obterá o resultado correto.

sort -h -t. -k1,4 sort_test.txt
    
por 16.02.2015 / 00:14
0

-n e -h ativam comparações numéricas; Nesta situação, quando dissermos " k3,4 ", k3 receberá um número de pontos flutuantes (k3 = 1,23 < 1,3) e k4="".

Com " -V " o comportamento é melhor: números de versão 1.2 < 1,3 < 1.23.

sort  -t. -k3,4V

aplicado a

192.168.10.3
192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23
192.168.9.3

retorna

10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56
192.168.9.3
192.168.10.3

O mesmo resultado será obtido com:

sort -t. -k3V
sort -V -t. -k3
    
por 19.02.2015 / 14:08