Я хочу знать общее количество времени, которое займет ряд процессов на моем компьютере, чтобы решить, должен ли я работать там или на более сильном компьютере. Итак, я прогнозирую время выполнения каждой команды. Вывод выглядит так:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Как суммировать второй столбец, чтобы получить общее время выполнения? Я мог бы попробовать пропустить каждую строку через
awk '{sum += $2 } END { print sum }
но это не имеет смысла, так как значения не являются натуральными числами.
bash
time
arithmetic
je_b
источник
источник
Предполагая, что вы используете встроенную команду bash 'time', перед запуском вашей программы вы можете это сделать
export TIMEFORMAT=%0R
. Выходные данные затем будут добавлены в awk за целые секунды. Более подробная информация доступна в разделе «Переменные оболочки» на странице руководства bash.источник
Если вы не можете (или не хотите) использовать
TIMEFORMAT
просто перенесенное время в секунды, то сложите его вместе. Например, труба выводится через:Или, если хотите, можете обменять последнюю
echo
командуисточник
$[sum/60%60]
лишены часов.Обновить:
Вот новая реализация, которая использует
dc
«выходную базу». Обратите внимание, что если общая сумма составляет более 60 часов, это приведет к выводу четырех разделенных пробелами значений вместо трех. (И если общая сумма меньше одного часа, будут выведены только два значения через пробел.)Предполагается, что ввод вводится в тройках часов, минут, секунд, как показано в вопросе.
Выход на указанный вход:
Оригинальный ответ:
Давайте сделаем это с
dc
вашим настольным калькулятором. Это серверная частьbc
, и она чрезвычайно гибкая, хотя часто считается загадочной.Во-первых, некоторые предварительные обработки, чтобы дать только времена, и преобразовать двоеточия в пробелы
Мы могли бы также сделать это с Sed:
Я пойду с Awk и
tr
потому что это проще. Любая из приведенных выше команд производит чистый вывод в следующем формате. (Я использую свой собственный пример текста, потому что считаю его более интересным; в него включены часы. Ваш также будет работать.)Для заданного времени в указанном выше формате запустите их с помощью следующего сценария Sed и передайте результат в
dc
виде, показанном ниже:(Сломан, чтобы уменьшить боковую прокрутку :)
Выходными данными будут секунды, минуты, часы в этой последовательности. (Обратите внимание, что это обратная последовательность.) Я только учусь,
dc
так что это не идеальное решение, но я думаю, что это довольно хорошо для первого взглядаdc
.Пример ввода и вывода, вставленный прямо из моего терминала:
источник
Вот мое решение - использовать
split()
. Общее время печати в секундах:Печать в удобном формате времени:
GNU awk также поддерживает strftime, но будет использовать ваш текущий часовой пояс, поэтому результаты могут привести к путанице.
источник
gawk
с ,TZ=UTC0 gawk...
чтобы снять вопрос часового пояса.Просто разделите и рассчитайте:
источник
Вариация на темы здесь, но больше труб
источник
Почти любая оболочка может сделать математику:
Используйте
getseconds $=t
в zsh, чтобы разделить его.источник