Quiero saber la cantidad total de tiempo que una serie de procesos tomaría en mi computadora para decidir si debo ejecutarla allí o en una computadora más fuerte. Entonces, pronostico el tiempo de ejecución de cada comando. El resultado se ve así:
process1 00:03:34
process2 00:00:35
process3 00:12:34
¿Cómo puedo sumar la segunda columna para obtener un tiempo total de ejecución? Podría intentar pasar cada línea
awk '{sum += $2 } END { print sum }
pero esto no tiene sentido ya que los valores no son números naturales.
bash
time
arithmetic
je_b
fuente
fuente
Suponiendo que está utilizando el comando incorporado bash 'time', antes de ejecutar su programa, puede hacerlo
export TIMEFORMAT=%0R
. La salida se agregará en segundos completos por awk. Hay más información disponible en la sección 'Variables de Shell' de la página de manual de bash.fuente
Si no puede (o no quiere) usar
TIMEFORMAT
su simple necesidad de transferir el tiempo en segundos, luego agréguelo. Por ejemplo, salida de tubería a través de:O si lo desea, puede intercambiar el último
echo
comando porfuente
$[sum/60%60]
para quitar las horas libres.Actualizar:
Aquí hay una nueva implementación que hace uso de
dc
la "base de salida". Tenga en cuenta que si la suma total es más de 60 horas, esto generará cuatro valores separados por espacios en lugar de tres. (Y si la suma total es inferior a una hora, solo se generarán dos valores separados por espacios).Se supone que la entrada está en triples de hora, minuto, segundo, como se muestra en la pregunta.
La salida en la entrada proporcionada es:
Respuesta original:
Hagamos esto con
dc
su calculadora de escritorio. Es el back-endbc
y es extremadamente flexible, aunque a menudo se considera críptico.Primero, algo de preprocesamiento para dar solo los tiempos y convertir los dos puntos en espacios:
También podríamos hacer esto con Sed:
Iré con Awk y
tr
porque es más simple. Cualquiera de los comandos anteriores produce una salida limpia en el siguiente formato. (Estoy usando mi propio texto de ejemplo porque lo considero más interesante; tiene horas incluidas. El suyo también funcionará).Dados los tiempos en el formato anterior, ejecútelos en el siguiente script Sed y canalice el resultado
dc
como se muestra a continuación:(Desglosado para reducir el desplazamiento lateral :)
La salida será segundos, minutos, horas, en esa secuencia. (Tenga en cuenta que esta es una secuencia inversa.) Estoy aprendiendo,
dc
así que esta no es una solución perfecta, pero creo que es bastante buena para un primer vistazodc
.Ejemplo de entrada y salida, pegado directamente desde mi terminal:
fuente
Aquí está mi solución: uso
split()
. Tiempo total de impresión en segundos:Impresión en formato de hora agradable:
GNU awk también admite strftime, pero usará su zona horaria actual, por lo que los resultados serían confusos.
fuente
gawk
conTZ=UTC0 gawk...
para eliminar el problema de la zona horaria.Solo divide y calcula:
fuente
Variación sobre temas aquí, pero más tubos
fuente
Casi cualquier caparazón podría hacer los cálculos:
Use
getseconds $=t
en zsh para que se divida.fuente