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