用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
数据在文件 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