Adiciona zero à direita do tempo formatado do awk

2

Eu uso o seguinte comando para converter decimal value em time value :

echo "1.5" | awk -F'.' '{printf $1 ":" "%.0f", $2 / 100 * 60}'

saídas: 1:3

como posso fazer awk adicionar um zero à direita para a saída, então eu obteria: 1:30 ?

    
por nath 15.12.2017 / 21:48

2 respostas

5

Eu não acho que adicionar um 0 à direita seja uma boa abordagem. Pode produzir a saída pretendida para o 1.5 como entrada, mas se você precisar de uma solução geral para outras entradas, essa abordagem provavelmente não funcionará bem.

Uma abordagem melhor é não dividir a parte inteira e as partes decimais, mas trabalhar com minutos, usando os operadores / e % para calcular as horas e minutos corretos, por exemplo:

awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.5
# prints 1:30

awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.50
# prints 1:30

awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.7
# prints 1:42

awk '{printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< 1.05
# prints 1:03

Para lidar com valores negativos, você pode introduzir uma função abs :

awk 'function abs(v) {return v < 0 ? -v : v} 
     {printf "%d:%02d", ($1 * 60 / 60), ($1 * 60 % 60)}' <<< -1.7
# prints -1:42
    
por 15.12.2017 / 21:59
1

Como você não sabe quantos dígitos fracionários você tem, você não sabe que precisa dividir por 100. @janos tem a resposta correta, mas se você insiste em dividir o ponto decimal, você precisa force converter a parte fracionária de volta em um número fracionário:

echo 1.5 | awk -F'.' '{printf "%d:%02d\n", $1, ("0."$2) * 60}'

"0."$2 é concatenação de strings resultando na string "0.5".
Em seguida, multiplique pelo número 60 para obter o número de minutos.

Ou você pode descobrir qual divisor usar, com base no número de dígitos

awk -F'.' '{printf "%s\t%d:%02d\n", $0, $1, $2 / 10**length($2) * 60}' << END
1
1.5
1.75
1.6666667
END
1       1:00
1.5     1:30
1.75    1:45
1.6666667       1:40

Mas não faça nenhuma dessas coisas.

    
por 15.12.2017 / 22:39

Tags