用awk计算时间段?

Counting time periods with 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 个字段位置,我的意思是,我需要取出 end time 并把 resulting periods 代替,所以该行将导致:

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;%s\n", ,,,,,split(,a,":"),a[1]*60+a[2]-split(,b,":"),b[1]*60+b[2]/30,,,}' 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

$  awk 'BEGIN{FS=OFS=";"} {split(,a,":");split(,b,":");=(((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