【问题标题】:Calculating the total time in an online meeting计算在线会议的总时间
【发布时间】:2020-12-23 02:48:42
【问题描述】:

假设有一个会议,会议记录保存在 CSV 文件中。如何编写 bash 脚本/awk 脚本来找出员工在线的总时间。一名员工可以离开和重新加入会议,他/她的所有在线时间都应计算在内。

我所做的如下,但是卡在如何将一条记录与所有其他记录进行比较,并添加每个人加入和离开对的总时间。

#!/bin/bash

inputFile=$1
startTime=$(date -u -d $2 +"%s")
endTime=$(date -u -d $3 +"%s")

awk 'BEGIN{ FS=","; totalTime=0; }

        {
            for (rows=1; rows <= NR; rows++) {
             #I am stuck here on how to compare a record with each and every record
                     if (($1==?? && $2=="Joined") && ($1==?? && $2=="Left")) {
                     totalTime=$($(date -u -d $3 +"%s")-$(date -u -d $3 +"%s"))
       print $1 "," $totalTime +"%H:%M:%S"
 }' $inputFile

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

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

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

Bob,    00:30:00
John,    01:02:00

CSV文件内容如下:

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

【问题讨论】:

  • name=$1; if (name in names) { times[name]=$3} else {names[$1]=$1;times[$1]=$3} 是关于如何“将记录与每条记录进行比较”的想法。 .通过awk tutorial 工作。特别注意awk 的关联数组。根据提供的数据计算经过的时间将是一个高级问题。您可能需要为此单独提出一个问题。希望您可以访问gawk v &gt;= 4.0。祝你好运。
  • The output may look like this 下的文本块替换为您提供的示例输入的实际输出必须看起来像。

标签: bash shell awk sed scripting


【解决方案1】:
$ 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)
}

.

$ awk -f tst.awk file
James, 01:39:30
Bob, 01:24:00
John, 00:41:00

如果您需要考虑 DST 转换、闰秒、一夜之间(或持续多天)的会议、会议结束时仍然在会议中的人,或者您的问题中未显示的任何其他问题 - 剩下的作为练习:-)。

【讨论】:

  • 谢谢,对我帮助很大。我很好奇如何改进它,以便(仅必须考虑 startTime (10:00:00) 和 EndTime (13:00:00) 之间的时间。还有加入但未离开的人被视为离开在 Endtime 和他们的在线时间也应该添加)。我试过但没有想要的输出
  • Chameleon questions 强烈反对这个论坛。我发布的内容回答了您提出的问题,请参阅 stackoverflow.com/help/someone-answers 了解下一步该做什么,如果您有后续问题,请随时发布新的后续问题。
猜你喜欢
  • 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
相关资源
最近更新 更多