Может кто-нибудь объяснить эту команду AWK?

#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