【问题标题】:Calculating the total time in an online meeting - follow up计算在线会议的总时间 - 跟进
【发布时间】:2020-12-23 17:18:21
【问题描述】:

这是问题的后续: Calculating the total time in an online meeting

假设有一个会议,会议记录保存在 CSV 文件中。如何编写 bash 脚本/awk 脚本来找出员工在线的总时间。一名员工可以离开和重新加入会议,他/她的所有在线时间都应计算在内。 我所做的如下,但在如何将一条记录与所有其他记录进行比较,并添加每个加入和离开的人对的总时间时遇到了问题。

cat tst.awk
BEGIN { FS=" *, *"; OFS=", " }
NR==1 { next }
$1 in joined {
    jt = time2secs(joined[$1])
    lt = time2secs($3)
    totSecs[$1] += (lt - jt)
    delete joined[$1]
    next
}
{ joined[$1] = $3 }
END {
    for (name in totSecs) {
        print name, secs2time(totSecs[name])
    }
}

function time2secs(time,        t) {
    split(time,t,/:/)
    return (t[1]*60 + t[2])*60 + t[3]
}

function secs2time(secs,        h,m,s) {
    h = int(secs / (60*60))
    m = int((secs - (h*60*60)) / 60)
    s = int(secs % 60)
    return sprintf("%02d:%02d:%02d", h, m, s)
}

会议的开始时间和结束时间在命令行中给出,例如:

$ ./script.sh input.csv 10:00:00 13:00:00

只应考虑 startTime (10:00:00) 和 EndTime (13:00:00) 之间的时间。已加入但未离开的人,在结束时必须被视为已离开,并且还应添加在线时间。我试过了,但没有想要的结果。

输出应如下所示:(可以存储在输出文件中)

Bob,    02:44:00
John,    00:41:00
David,   02:50:00
James,   01:39:30

CSV文件内容如下:

    Employee_name, Joined/Left, Time  
    David, joined, 09:40:00
    David, left, 10:20:00
    David, joined, 10:30:00
    John, joined, 10:00:00  
    Bob, joined, 10:01:00  
    James, joined, 10:00:30  
    Bob, left, 10:20:00    
    James, left, 11:40:00  
    John, left, 10:41:00
    Bob, joined, 10:35:00

【问题讨论】:

    标签: bash shell awk sed


    【解决方案1】:
    $ cat tst.awk
    BEGIN { FS=" *, *"; OFS=", " }
    NR==1 { next }
    { names[$1] }
    $3 < beg { next }
    $3 >= end { exit }
    $2 == "joined" {
        joined[$1] = $3
    }
    ($2 == "left") && ($1 in joined) {
        jt = time2secs(joined[$1])
        lt = time2secs($3)
        totSecs[$1] += (lt - jt)
        delete joined[$1]
        next
    }
    END {
        for (name in names) {
            if (name in joined) {
                jt = time2secs(joined[name])
                lt = time2secs(end)
                totSecs[name] += (lt - jt)
            }
            print name, secs2time(totSecs[name])
        }
    }
    
    function time2secs(time,        t) {
        split(time,t,/:/)
        return (t[1]*60 + t[2])*60 + t[3]
    }
    
    function secs2time(secs,        h,m,s) {
        h = int(secs / (60*60))
        m = int((secs - (h*60*60)) / 60)
        s = int(secs % 60)
        return sprintf("%02d:%02d:%02d", h, m, s)
    }
    

    .

    $ awk -v beg='10:00:00' -v end='13:00:00' -f tst.awk file
    James, 01:39:30
    David, 02:30:00
    Bob, 02:44:00
    John, 00:41:00
    

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多