ordenar comportamento ao usar a opção numérica: “sort -k2,2 -nk6,6 foo” vs “sort -k2,2 -k6,6n foo”

2

Os dois exemplos no título produzem resultados muito diferentes. O primeiro ( sort -k2,2 -nk6,6 foo ) traz os seguintes resultados:

153759 townhome 900 2 1 79000
876543 townhome 745 2 1 79000
222999 townhome 850 2 2 83333
759153 condo 850 2 1.5 85000
453215 townhome 1000 3 1.5 86000
646484 condo 890 3 1 93333
444555 condo 930 2 1 99999

O segundo ( sort -k2,2 -k6,6n foo ) traz de volta:

759153 condo 850 2 1.5 85000
646484 condo 890 3 1 93333
444555 condo 930 2 1 99999
777894 condo 790 3 1 101000
221155 condo 1030 3 1 109500
248624 duplex 1250 3 1 120000
987654 duplex 1100 3 1.5 140000

Estes são os resultados corretos que estou procurando.

O que causa a diferença?

    
por Tim 29.11.2015 / 21:26

1 resposta

1

Como mikeserv disse , mas com mais palavras:

Usar a opção de classificação numérica 'global' -n altera o comportamento global da classificação para usar a classificação numérica para todas as chaves ( referência ) definindo gkey.numeric e, posteriormente, definindo a opção de classificação de cada chave para a opção de classificação numérica globalmente definida. Isso faz com que a ordenação no campo 2 falhe, de modo que ele passa por uma classificação (numericamente) no campo 6.

Definindo a opção de pedido n dentro da opção -k afeta apenas a ordenação naquele campo, então ele pode classificar no campo 2 até que não seja exclusivo, e então passar para numericamente ordenar no campo 6.

Como não consegui encontrar linhas 'duplex' no seu primeiro exemplo de classificação, combinei todas as linhas de amostra para criar um novo arquivo de entrada de amostra:

153759 townhome 900 2 1 79000
221155 condo 1030 3 1 109500
222999 townhome 850 2 2 83333
248624 duplex 1250 3 1 120000
444555 condo 930 2 1 99999
453215 townhome 1000 3 1.5 86000
646484 condo 890 3 1 93333
759153 condo 850 2 1.5 85000
777894 condo 790 3 1 101000
876543 townhome 745 2 1 79000
987654 duplex 1100 3 1.5 140000

... contra o qual podemos demonstrar o comportamento do tipo com o --debug flag; observe os avisos "sem correspondência" e os sublinhados no 6º campo, indicando a parte da linha usada para classificação:

$ sort -k2,2 -nk6,6 --debug < input
sort: using ‘en_US.UTF-8’ sorting rules
153759 townhome 900 2 1 79000
       ^ no match for key
                        _____
_____________________________
876543 townhome 745 2 1 79000
       ^ no match for key
                        _____
_____________________________
222999 townhome 850 2 2 83333
       ^ no match for key
                        _____
_____________________________
759153 condo 850 2 1.5 85000
       ^ no match for key
                       _____
____________________________
453215 townhome 1000 3 1.5 86000
       ^ no match for key
                           _____
________________________________
646484 condo 890 3 1 93333
       ^ no match for key
                     _____
__________________________
444555 condo 930 2 1 99999
       ^ no match for key
                     _____
__________________________
777894 condo 790 3 1 101000
       ^ no match for key
                     ______
___________________________
221155 condo 1030 3 1 109500
       ^ no match for key
                      ______
____________________________
248624 duplex 1250 3 1 120000
       ^ no match for key
                       ______
_____________________________
987654 duplex 1100 3 1.5 140000
       ^ no match for key
                         ______
_______________________________

vs:

$ sort -k2,2 -k6,6n --debug < input
sort: using ‘en_US.UTF-8’ sorting rules
sort: leading blanks are significant in key 1; consider also specifying 'b'
759153 condo 850 2 1.5 85000
      ______
                       _____
____________________________
646484 condo 890 3 1 93333
      ______
                     _____
__________________________
444555 condo 930 2 1 99999
      ______
                     _____
__________________________
777894 condo 790 3 1 101000
      ______
                     ______
___________________________
221155 condo 1030 3 1 109500
      ______
                      ______
____________________________
248624 duplex 1250 3 1 120000
      _______
                       ______
_____________________________
987654 duplex 1100 3 1.5 140000
      _______
                         ______
_______________________________
153759 townhome 900 2 1 79000
      _________
                        _____
_____________________________
876543 townhome 745 2 1 79000
      _________
                        _____
_____________________________
222999 townhome 850 2 2 83333
      _________
                        _____
_____________________________
453215 townhome 1000 3 1.5 86000
      _________
                           _____
________________________________
    
por 13.06.2016 / 18:09

Tags