用awk计算时间段



数据在文件data.csv中,下一个格式为:

11;Study area;Class name G1-T1-(1031-1-32517);English;Monday;17:30;20:30;S31;Peter Gabriel

从字段6(开始时间(和7(结束时间(中,我需要获得它们之间30分钟的周期数,并将它们打印在第7个字段中,我的意思是,我需要去掉结束时间,并将产生的周期放进去,因此该行将产生:

11;Study area;Class name G1-T1-(1031-1-32517);English;Monday;17:30;6;S31;Peter Gabriel

当时的想法是将小时与分钟分开,将小时乘以60,再加上分钟。所有这些都适用于开始和结束时间,然后进行减法运算,最后除以30:

开始时间:17:30→(17*60(+30=1050

结束时间:20:30→(20*60(+30=1230

基板:1230-1050=180/30=6(30分钟(

我想出的代码如下:

awk -F';' -v OFS=';' '{printf "%s;%s;%s;%s;%s;%s;%s;%s;%sn", $1,$3,$4,$5,$6,split($7,a,":"),a[1]*60+a[2]-split($6,b,":"),b[1]*60+b[2]/30,$8,$9,$10}' data.csv

我得到的结果显然不是想要的,这给了我一系列的问题。。。

11;Study area;Class name G1-T1-(1031-1-32517);English;Monday;17:30;2;1228;1021;S31

在字段6(开始时间(之后,我得到了小时划分为的元素数量:2(不需要(。

然后1228,这似乎来自于从1230(结束时间中的运算结果(减去元素量的开始时间(2(

然后1021,我不知道在哪里

然后S31,这是正确的,但又被移动了一个字段,使原来的最后一个字段消失:Peter Gabriel

我不知道如何将除以30的除法应用于子动作结果(我尝试过使用不同的括号类型(,我也不确定它是否真的只应用于子运算的第二个成员。。。

也许我的方法完全错了,对不起,我还是搞不清楚,我正在努力。

使用awk

$  awk 'BEGIN{FS=OFS=";"} {split($6,a,":");split($7,b,":");$7=(((b[1]*60)+b[2])-((a[1]*60)+a[2]))/30}1' input_file
11;Study area;Class name G1-T1-(1031-1-32517);English;Monday;17:30;6;S31;Peter Gabriel

最新更新