要在AWK命令中求和时间(00:00:00)

要在AWK命令中求和时间(00:00:00),awk,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 alib

我有一个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

类似于以下内容:

$ 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
基本上,您需要将所有时间组件转换为秒,将记录相加并再次将其分解为组件。您也可以使用,但这不允许所有的hh:mm:ss输出,因为时间>24小时将转换为日期

编辑

添加了按公司名称对所有upp所有值进行求和和和分组的版本:

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

另一个使用空格和:作为分隔符的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

4+5=8? 请在您的问题中添加示例输入和您对该示例输入的期望输出。亲爱的Cryus,我是新来的,但我已经举了两个例子thereamad@amad-VirtualBox:~$cat e1.txt亚马逊| 1易趣| 2阿里巴巴| 3易趣| 1亚马逊| 5amad@amad-VirtualBox:~$cat e2.txt亚马逊| 1:02:00易趣| 2:50:00阿里巴巴| 240:00:00易趣| 3:04:00亚马逊| 72:00:00amad@amad-VirtualBox:~$awk-F'|'$1==“易趣”{sum+=$2}结束{print sum}'e1.txt 3amad@amad-VirtualBox:~$awk-F'|'$1==“易趣”{sum+=$2}结束{print sum}'e2.txt 5amad@amad-VirtualBox:~$非常感谢您的及时回复,但当我运行时,我遇到以下错误:awk:line 1:语法错误或附近+=awk:line 1:extra')'awk:line 1:extra')'awk:line 1:语法错误或附近=重新加载页面并剪切粘贴脚本。之前有一个bug。谢谢James,我在运行您的命令后删除了24:00:00的值结果是0:00:00我不知道怎么了亲爱的James非常感谢,我已经用下面的命令解决了这个问题。请欣赏它awk-F'|'$1==“KRK”{split($2,a,“:”)#单独的hs,ms和sses b+=a[1]*3600+a[2]*60+a[3]#以秒计#END{h=int(b/3600)#分开hs m=int((b-3600*h)/60)#和ms s=b-3600*h-60*m#和ss printf“%d:%02d:%02d\n”,h,m,s#output}fiber1.txt 3:38:00非常感谢亲爱的我是新来的,我如何投票增加你的分数,或者我想用金钱奖励你,请让我知道如何与你聊天?