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,但第四行的值为负值。我一定是弄错了。很可能是一个奇怪的字符问题。请尝试在文件中手动输入整行