#unix #awk
#unix #awk
Вопрос:
Я пытаюсь вычислить среднее значение списка часов, я нашел команду awk, которая работает довольно хорошо, но я хочу знать, как это работает.
Это мой список часов:
20:09 19:24 19:28
И это программа
awk -F':' '
BEGIN {
total=0;
}
{
total =(($1*3600) ($2*60) $3);
}
END {
a=(total/NR);
printf "d:d:dn",(a/3600),((a/60)`),(a`)
}' file
Я понимаю первую часть и то, как она преобразует все в секунды, но не более того.
Ответ №1:
Не могли бы вы, пожалуйста, попробовать следующее объяснение, основанное на показанных попытках OP.
# Start awk program from here, set field separator as :
awk -F':' '
# The BEGIN block is only executed once, when the script starts
BEGIN{
# Initialize total
total=0
}
# Main script executes for each input line
{
# Convert to seconds: Multiply first field $1 by 3600 and second by 60
# then add the terms together, and add to total
total =(($1*3600) ($2*60) $3)
}
# The END block executes when we have finished reading all lines
END{
# Calculate average: divide total by number of lines
a=(total/NR)
# Print result, where a/3600 is hours,
# (a/60)` is remainder in minutes, a` remainder seconds
# -- the d format specifier takes care to discard any decimals
printf "d:d:dn",(a/3600),((a/60)`),(a`)
}
' file # input file name
Ответ №2:
Краткий ответ: этот код вычисляет среднюю продолжительность некоторого времени, которое находится в файле
file
Я предполагаю, что у вас есть файл, который выглядит примерно так:
00:02:30: something1
00:01:14: something2
01:02:04: something3
Я также предполагаю, что первые три значения представляют продолжительность в часах, минутах и секундах.
Что делает код, так это извлекает длительность в строке, преобразует ее в общее количество секунд и добавляет к значению total
. Когда обрабатываются все строки, вычисляется средняя продолжительность путем деления ее на NR
, что представляет общее количество обработанных строк. Затем он выводит среднее значение, преобразуя его обратно в hh:mm:ss
примечание: код может быть сведен к
awk -F':' '{t =3600*$1 $2*60 $3}
END{t/=NR; printf "d:d:dn",t/3600,(t/60)`),(t`) }' file