Quero saber a quantidade total de tempo que uma série de processos levaria no meu computador para decidir se eu deveria rodar lá ou em um computador mais forte. Então, estou prevendo o tempo de execução de cada comando. A saída se parece com:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Como posso somar a segunda coluna para obter um tempo total de execução? Eu poderia tentar percorrer cada linha
awk '{sum += $2 } END { print sum }
mas isso não faz sentido, pois os valores não são números naturais.
bash
time
arithmetic
je_b
fonte
fonte
Supondo que você esteja usando o comando interno bash 'time', antes de executar seu programa, você pode
export TIMEFORMAT=%0R
. A saída será então adicionada em segundos inteiros pelo awk. Mais informações estão disponíveis na seção 'Shell Variables' da página de manual do bash.fonte
Se você não pode (ou não quer) usar
TIMEFORMAT
apenas o tempo necessário para transferir o tempo em segundos, adicione-o. Por exemplo, saída de tubulação através de:Ou, se você quiser, pode trocar o último
echo
comando porfonte
$[sum/60%60]
para tirar as horas.Atualizar:
Aqui está uma nova implementação que faz uso da
dc
"base de saída" de s. Observe que se a soma total for superior a 60 horas, isso produzirá quatro valores separados por espaço em vez de três. (E se a soma total for inferior a uma hora, apenas dois valores separados por espaço serão exibidos.)A entrada é assumida em triplos de hora, minuto, segundo, conforme mostrado na pergunta.
A saída na entrada fornecida é:
Resposta original:
Vamos fazer isso com
dc
sua calculadora de mesa. É o back-endbc
e é extremamente flexível, embora muitas vezes considerado enigmático.Primeiro, algum pré-processamento para fornecer apenas os horários e converter os dois pontos em espaços:
Também poderíamos fazer isso com o Sed:
Eu vou com o Awk e
tr
porque é mais simples. Qualquer um dos comandos acima produz uma saída limpa no seguinte formato. (Estou usando meu próprio texto de exemplo porque o considero mais interessante; ele inclui horas. O seu também funcionará.)Dado os tempos no formato acima, execute-os através do seguinte script Sed e canalize o resultado
dc
conforme mostrado:(Dividido para reduzir a rolagem lateral :)
A saída será segundos, minutos, horas, nessa sequência. (Observe que esta é uma sequência invertida.) Estou apenas aprendendo,
dc
portanto, essa não é uma solução perfeita, mas acho que é muito bom para uma primeira olhadadc
.Exemplo de entrada e saída, colado diretamente do meu terminal:
fonte
Aqui está a minha solução - use
split()
. Tempo total de impressão em segundos:Imprimindo no formato de hora agradável:
O GNU awk também suporta strftime, mas usará seu fuso horário atual; portanto, os resultados seriam confusos.
fonte
gawk
comTZ=UTC0 gawk...
a remover o problema de fuso horário.Basta dividir e calcular:
fonte
Variação de temas aqui, mas mais tubos
fonte
Quase qualquer shell poderia fazer as contas:
Use
getseconds $=t
no zsh para dividir.fonte