A ordem numérica Bash fornece resultados diferentes quando as colunas são selecionadas simultaneamente vs. juntas

2

Com os seguintes dados de exemplo, as duas colunas são numéricas, mas a segunda tem números diferentes de dígitos.

2 9
1 1000
1 50
3 0

Eu quero classificar com base em ambas as colunas. Especificá-los separadamente com o sinalizador numérico, -n , produz o resultado desejado.

sort -n -k1,1 -k2,2 num.data.txt

1 50
1 1000
2 9
3 0

que é o que eu quero.

No entanto,

sort -n -k1,2 num.data.txt

fornece dados que parecem ser classificados em ordem alfabética:

1 1000
1 50
2 9
3 0

Eu sei que sort -n -k1,2 num.data.txt é o mesmo que sort -n num.data.txt (que dá o mesmo resultado) quando há apenas duas colunas, mas os dados com os quais estou realmente trabalhando têm mais colunas.

Por que existe essa discrepância entre os dois métodos?

    
por njc 27.03.2017 / 17:43

1 resposta

5

Uma especificação de chave -k1,2 especifica uma chave que começa no início da primeira coluna (inclui os espaços em branco à esquerda como o separador de coluna padrão é a transição de um não-branco para um em branco) e termina no final da segunda coluna.

É importante perceber que é apenas uma chave . Se você precisar de duas chaves, precisará de duas opções -k . Ao classificar, sort irá comparar a string "1 50" com "1 1000" numericamente. Para uma comparação numérica, essas cadeias são convertidas em números considerando a parte principal (ignorando espaços em branco à esquerda) que se parece com um número válido. Então, vamos comparar 1 e 1 . Como são iguais, sort reverterá para a classificação de fall-back para determinar os laços, o que é uma comparação léxica da linha inteira.

Com -n -k1,1 -k2,2 , sort compara "1" com "1" e, em seguida, como é um empate, considera a segunda chave ( " 50" vs " 1000" ). Como é uma classificação numérica, -n -k1 -k2 também funcionaria (onde -k1 especifica uma chave que começa no primeiro campo e termina no final da linha, igual à linha completa).

    
por 27.03.2017 / 17:55