Ordenação por unidades de tempo (por exemplo, ms, s, etc.) no Bash ou Shell

4

Qual seria a maneira mais fácil de classificar uma lista de números anexados a unidades de tempo no bash ou no shell? Em outras palavras, estou procurando algo semelhante a "sort -h", mas em vez de classificar unidades de tamanho, quero classificar as unidades de tempo (ns, us, ms, s).

Veja uma lista de exemplos que eu queria classificar:
1.234s
804.2754ms
603.223us
50.1234ms

    
por TLin 12.02.2017 / 10:02

1 resposta

3

Aqui está uma maneira de resolver esse problema:

  1. Adicione uma segunda coluna, com os horários convertidos para a mesma unidade
  2. Classifique a entrada na segunda coluna
  3. Solte a segunda coluna

Você pode fazer o passo 1 com um script awk, esse script converte as unidades de tempo em nanossegundos:

{
    time = $1;
    sub(/[a-z]+$/, "", time);
    unit = $1;
    sub(/^[^a-z]+/, "", unit);

    # convert to nanoseconds
    if (unit == "us") {
        time *= 1000;
    } else if (unit == "ms") {
        time *= 1000000;
    } else if (unit == "s") {
        time *= 1000000000;
    }
    print $1, time
}

Se você salvar isso em um arquivo convert.awk , poderá executar as etapas de 1 a 3 com este pipeline:

awk -f convert.awk input.txt | sort -g -k2 | cut -f1 -d' '

O -g em vez de -n é necessário no caso de alguns números serem exibidos em notação exponencial. (Crédito ao OP por apontar isso.)

    
por 12.02.2017 / 11:51