Bash: как рассчитать среднее значение для разных столбцов? - PullRequest
0 голосов
/ 13 ноября 2018

Я пишу скрипт для автоматического вычисления среднего времени выполнения.

Сначала мне нужно 100 раз запустить $ time ./foo.py и сохранить вывод в файл time.txt (работает)

$ for i in `seq 100`; do { time ./foo.py; } 2>> time.txt; done

Вывод выглядит следующим образом

time ./foo.py
real    0m0,030s
user    0m0,030s
sys     0m0,000s
[...]

Среда выполнения из разных сценариев находится в одном файле. Каждая запись начинается с time ./foo.py, за которой следуют 100 «триплетов» из real, user и sys.

Теперь, если возможно, мне бы хотелось, чтобы скрипт автоматически вычислял среднее время выполнения для каждого тестируемого файла, используя все 100 «триплетов» и аккуратно возвращая только один «средний триплет».

Я думал о том, чтобы, возможно, использовать awk для вычисления среднего значения, как это

awk '{ total += $2 } END { print total/NR }' time.txt

Но команда должна быть адаптирована к моим потребностям - в конце концов, только части после , (например, ,030s) могут быть использованы для вычислений, и s также необходимо игнорировать.

Поскольку я не знаю, как достичь этой цели, я подумал спросить сообщество.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 13 ноября 2018

Проще сказать, если time выводить информацию о времени в формате POSIX:

awk '/^real/ { totalReal += $2 } /^user/ { totalUser += $2 } /^sys/ { totalSys += $2 } END { print "realAvg " totalReal/(NR/4) "\n" "userAvg " totalUser/(NR/4) "\n" "sysAvg  " totalSys/(NR/4) }' time.txt

Печать выводится следующим образом:

realAvg 12.62
userAvg 27
sysAvg  3.8

Пояснение:

  • По сути, скажите awk, чтобы он проходил через каждую строку в файле, и, если строка начинается с real, добавьте ее в переменную totalReal, то же самое для user и sys. Так что, в основном, сохраняйте промежуточный итог каждого из трех «типов».
  • В конце просто выведите три промежуточные суммы, разделенные на число строк , разделенных на 4 . Это потому, что вы хотите, чтобы каждый «набор» из 4 строк считался 1 экземпляром, а NR в awk просто подсчитывает количество строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...