想要将AWK命令中的时间(00:00:00)求和

时间:2019-01-05 09:08:13

标签: awk

我有awk命令对另一个文件中的时间求和,它可以使用数字,但是尝试使用小时数则无法运行

示例

> cat ee.txt
amazon|4
ebay|5
alibab|10
ebay|4
amazon|5

> awk -F '|' '$1 ~ /ebay/{ sum += $2 } END{ print sum }' ee.txt
8

但是当我需要加总时间时命令不起作用

> cat ee.txt
amazon  1:02:00
ebay    2:00:00
alibab  240:00:00
ebay    3:00:00
amazon  72:00:00

> awk -F '|' '$1 ~ /ebay/{ sum += $2 } END{ print sum }' ee.txt

输出应为5:00:00

2 个答案:

答案 0 :(得分:0)

类似这样的东西:

Royal Botanic Gardens

基本上,您需要将所有时间分量转换为秒,对记录求和,然后再次将其分解为分量。您还可以使用GNU awk's time functions,但是不允许所有hh:mm:ss输出,因为时间> 24小时会转换为日期。

修改

添加了一个版本,用于汇总所有值并按公司名称分组:

$ awk '
/ebay/ {
    split($2,a,":")                # separate hs, ms and sses
    b+=a[1]*3600+a[2]*60+a[3]      # sum them up as as seconds
}
END {
    h=int(b/3600)                  # separate hs
    m=int((b-3600*h)/60)           # and ms
    s=b-3600*h-60*m                # and sses
    printf "%d:%02d:%02d\n",h,m,s  # output
}' file
5:00:00

答案 1 :(得分:0)

使用空格和:作为分隔符的另一个awk

$ awk -F"[ :]+" ' { a[$1]+=$2*3600+$3*60+$4 } END {for(i in a){hr=int(a[i]/3600);mi=int((a[i]-hr*3600)/60);s=a[i]-3600*hr-60*mi;printf("%s %02d:%02d:%02d\n", i,hr,mi,s) }}' ee.txt
ebay 05:00:00
alibab 240:00:00
amazon 73:02:00