maior número possível para ordenar -n

6

Como determinar o "maior número" de modo que o tipo -n sempre vai colocá-lo no final? Estou pensando em algo ao longo de Inf em algumas línguas, mas não tenho certeza se existe algo parecido para isso.

O pano de fundo é que estou classificando a lista de caminhos potencialmente inexistentes por idade para que

  • existente primeiro, do mais novo ao mais antigo,

  • inexistente vai por último.

Estou usando a abordagem da decoração e tentando colocar pena nos nascituros:

INFINITY=99999999999999   # ...close enough, right?

age_of() {
    if [ -e $1 ];
    then
        local ctime=$(stat -c %Z "$1" 2>/dev/null)
        local now=$(date +%s)
        echo $(($now - $ctime))
    else
        echo $INFINITY
    fi
}

cat - \
  | while read path;
    do
        echo "$(age_of $path) $path"
    done \
      | sort -n \
      | cut -d\  -f 2-

mas obviamente o comentário é bastante ingênuo; é só uma questão de tempo em que nem o 99999999999999 não estará perto o suficiente. ;)

Então, existe um valor melhor para o INFINITY?

    
por Alois Mahdal 14.03.2014 / 20:57

1 resposta

5

Não é uma solução POSIX, mas a classificação GNU oferece a opção -g , que suporta uma gama mais ampla de especificações numéricas, incluindo o infinito. De link -

‘-g’
‘--general-numeric-sort’
‘--sort=general-numeric’

Sort numerically, converting a prefix of each line to a long double-precision
floating point number. See Floating point. Do not report overflow, underflow, or
conversion errors. Use the following collating sequence:

    Lines that do not start with numbers (all considered to be equal).
    NaNs (“Not a Number” values, in IEEE floating point arithmetic) in a
      consistent but machine-dependent order.
    Minus infinity.
    Finite numbers in ascending numeric order (with -0 and +0 equal).
    Plus infinity. 

Use this option only if there is no alternative; it is much slower than
--numeric-sort (-n) and it can lose information when converting to floating
point.

Dos meus próprios testes, parece que qualquer linha que comece com Inf (qualquer combinação de maiúsculas / minúsculas) aparecerá após qualquer número.

Caso contrário, não há sequências de caracteres que sejam classificadas de forma confiável após números usando sort -n . A classificação GNU parece tratar todas as outras seqüências primeiro como zero, colocando os números negativos depois, mas antes os positivos. O que você poderia fazer, se são os timestamps que estão sendo classificados, é usar o valor máximo para um timestamp de 64 bit mais um:

 9,223,372,036,854,775,808

Este é mais alguns dígitos do que você começou!

    
por 14.03.2014 / 22:28

Tags