Time Awk和从结束时间和持续时间计算开始时间
我有一个十进制格式的文件,上面有日期、结束时间和持续时间,我需要计算开始时间。该文件看起来像:Time Awk和从结束时间和持续时间计算开始时间,time,awk,Time,Awk,我有一个十进制格式的文件,上面有日期、结束时间和持续时间,我需要计算开始时间。该文件看起来像: 20140101;1212;1.5 20140102;1515;1.58 20140103;1759;.69 20140104;1100;12.5 ... 12:12的持续时间1.5表示一个半小时,开始时间为12:12-1:30=10:42 AM或11:00-12.5=11:00-12:30=22:30 PM。有没有一个简单的方法来计算Awk中的时间差,或者是一个很好的方法,你可以自己重新计算一次
20140101;1212;1.5
20140102;1515;1.58
20140103;1759;.69
20140104;1100;12.5
...
12:12的持续时间1.5表示一个半小时,开始时间为12:12-1:30=10:42 AM或11:00-12.5=11:00-12:30=22:30 PM。有没有一个简单的方法来计算Awk中的时间差,或者是一个很好的方法,你可以自己重新计算一次
由于这些值以小时和分钟为单位,因此只能丢弃分钟和秒,例如,持续时间1.58表示1:34,剩余的0.8秒可以丢弃
我在GNU Awk 4.1.3上,我会这样做:
awk 'BEGIN{FS=OFS=";"}
{ h=substr($2,0,2); m=substr($2,3,2); mins=h*60 + m; diff=mins - $3*60;
print $0, int(diff/60) ":" int(diff%60)
}' file
也就是说,将所有内容转换为分钟,然后再转换回小时/分钟
测验
我会这样做:
awk 'BEGIN{FS=OFS=";"}
{ h=substr($2,0,2); m=substr($2,3,2); mins=h*60 + m; diff=mins - $3*60;
print $0, int(diff/60) ":" int(diff%60)
}' file
也就是说,将所有内容转换为分钟,然后再转换回小时/分钟
测验
我强烈建议使用支持日期时间计算的编程语言,因为由于夏令时转换,计算在细节上可能很复杂。您可以使用Python,例如: 开始_times.py: 运行: 输出:
20140101;1212;1.5;20140101;1042
20140102;1515;1.58;20140102;1340
20140103;1759;.69;20140103;1717
20140104;1100;12.5;20140103;2230 <-- you see, the day matters!
20140101;1212;1.5;20140101;1042
20140102;1515;1.58;20140102;1340
20140103;1759;.69;20140103;1717
20140104;1100;12.5;20140103;2230我强烈建议使用支持日期时间计算的编程语言,因为由于夏令时转换,计算在细节上可能很复杂。您可以使用Python,例如:
开始_times.py:
运行:
输出:
20140101;1212;1.5;20140101;1042
20140102;1515;1.58;20140102;1340
20140103;1759;.69;20140103;1717
20140104;1100;12.5;20140103;2230 <-- you see, the day matters!
20140101;1212;1.5;20140101;1042
20140102;1515;1.58;20140102;1340
20140103;1759;.69;20140103;1717
20140104;1100;12.5;20140103;2230当您使用gawk
时,请冒险使用其本机时间函数
:
gawk -F\; '{tmst=sprintf("%s %s %s %s %s 00",\
substr($1,1,4),\
substr($1,5,2),\
substr($1,7,2),\
substr($2,1,2),\
substr($2,3,2))
t1=mktime(tmst)
seconds=sprintf("%f",$3)+0
seconds*=60*60
difference=strftime("%H%M",t1-seconds)
print $0""FS""difference}' file
结果:
20140101;1212;1.5;1042
20140102;1515;1.58;1340
20140103;1759;.69;1717
20140104;1100;12.5;2230
检查:
说明:
tmst=sprintf(..)
:用于从文件创建日期字符串
符合mktime
函数YYYY-MM的datespec
DD HH MM不锈钢[DST]
t1=mktime(tmst)
:将datespec转换为时间戳,而不是
通过gawk
处理(作为自1起经过的秒数
1970年1月)
seconds=sprintf(“%f”,$3)+0
:将第三个字段转换为float
seconds*=60*60
:将小时(浮动)转换为秒
difference=strftime(“%H%M”,t1秒)
:获取
人类男人,小时一分钟
当您使用gawk
时,请冒险使用其本机时间函数
:
gawk -F\; '{tmst=sprintf("%s %s %s %s %s 00",\
substr($1,1,4),\
substr($1,5,2),\
substr($1,7,2),\
substr($2,1,2),\
substr($2,3,2))
t1=mktime(tmst)
seconds=sprintf("%f",$3)+0
seconds*=60*60
difference=strftime("%H%M",t1-seconds)
print $0""FS""difference}' file
结果:
20140101;1212;1.5;1042
20140102;1515;1.58;1340
20140103;1759;.69;1717
20140104;1100;12.5;2230
检查:
说明:
tmst=sprintf(..)
:用于从文件创建日期字符串
符合mktime
函数YYYY-MM的datespec
DD HH MM不锈钢[DST]
t1=mktime(tmst)
:将datespec转换为时间戳,而不是
通过gawk
处理(作为自1起经过的秒数
1970年1月)
seconds=sprintf(“%f”,$3)+0
:将第三个字段转换为float
seconds*=60*60
:将小时(浮动)转换为秒
difference=strftime(“%H%M”,t1秒)
:获取
人类男人,小时一分钟
那么1.58
是什么意思?1小时34分几秒?更好地显示预期的输出。您的awk版本是否真的呆呆了?使用awk--version检查。祝你好运。1.58
是什么意思?1小时34分几秒?更好地显示预期的输出。您的awk版本是否真的呆呆了?使用awk--version检查。祝你好运。它无法处理例如“20140104;1100;12.5”。它生成“20140101;1100;12.5;-1:-30”。@JamesBrown然后从一开始就提供更具代表性的输入以及预期的输出。@JamesBrown您提供的示例的输出应该是什么?使用无法处理的信息更新原始问题,例如“20140104;1100;12.5”。它生成“20140101;1100;12.5;-1:-30”。@JamesBrown然后从一开始就提供更具代表性的输入以及预期的输出。@JamesBrown您提供的示例的输出应该是什么?用这样一个非常好的Python代码片段更新您的原始问题!最好将导入pdb
移到开头,而不是每次循环时都导入它。@fedorqui它只是为了调试!:)谢谢pdb.set\u trace()
真是太棒了!哇,我从来没有听说过这个模块,很高兴了解它:)非常好的Python代码片段!最好将导入pdb
移到开头,而不是每次循环时都导入它。@fedorqui它只是为了调试!:)谢谢pdb.set\u trace()
真是太棒了!哇,我从来没有听说过这个模块,很高兴了解它:)谢谢你,先生。实际上我试着玩mktime,但第四行的值为负值。我一定是弄错了。很可能是一个奇怪的字符问题。请尝试在文件中手动输入整行。谢谢,先生。实际上我试着玩mktime,但第四行的值为负值。我一定是弄错了。很可能是一个奇怪的字符问题。请尝试在文件中手动输入整行