如何解决计算在线会议的总时间
假设有一个会议并将会议记录保存在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,10:01:00
James,10:00:30
Bob,left,10:20:00
Bob,10:35:00
Bob,11:40:00
James,11:40:00
John,10:41:00
Bob,11:45:00
解决方法
$ 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",s)
}
。
$ awk -f tst.awk file
James,01:39:30
Bob,01:24:00
John,00:41:00
如果您需要考虑DST转换,leap秒,会议整夜(或连续数天),会议结束时人们仍在会议中,或者您的问题中没有显示的其他任何内容-剩下的作为练习:-)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。