实用程序脚本 - 查找时间变化

时间:2009-10-30 12:16:27

标签: scripting

我在文本文件中有一个时间戳列表。我想弄清楚变化超过给定阈值的时间。

输入格式:

  

10时13分55秒
  10:14:00
  10时14分01秒
  10点14分02秒
  10点14分41秒
  10点14分46秒
  十时十七分58秒
  10:18:00
  十时19分10秒
  10点19分16秒

如果阈值是30秒,我希望输出列出更改为> = 30秒的情况

例如。 10:14:02和10:14:41,10:14:46和10:17:58

bash,python或ruby中的解决方案会很有帮助。感谢。

5 个答案:

答案 0 :(得分:2)

我倾向于使用awk(使用sed过滤器来破坏你的阵容)这样的事情:

echo '10:13:55 10:14:00 10:14:01 10:14:02
      10:14:41 10:14:46 10:17:58 10:18:00
      10:19:10 10:19:16'
| sed -e 's/  *//g' -e 's/^ //' -e 's/ $//' -e 's/ /\n/g'
| awk -F: '
    NR==1 {s=$0;s1=$1*3600+$2*60+$3}
    NR>1 {t1=$1*3600+$2*60+$3;if (t1-s1 > 30) print s" "$0;s1=t1;s=$0}
    '

输出:

10:14:02 10:14:41
10:14:46 10:17:58
10:18:00 10:19:10

以下是它的工作原理:

  1. 它将字段分隔符设置为:以便于提取。
  2. 当记录编号为1(NR==1)时,它只存储时间(s=$0)和自午夜(s1=$1*3600+$2*60+$3)以来的秒数。这是第一个基线。
  3. 否则(NR>1),它获取自午夜(t1=$1*3600+$2*60+$3)以来的秒数,如果距离最后一次超过30秒,则输出最后一次和此时间({{1 }})。
  4. 然后重置下一行(if (t1-s1 > 30) print s" "$0)的基线。
  5. 请记住,s1=t1;s=$0命令可能在此示例中需要更复杂 - 它将所有空间序列折叠到一个空格,从行的开头和结尾删除它们然后将换行符转换为空格。根据您的数据的输入形式(由于其格式化以便于阅读,因此很复杂),这可能不是全部必要的。

    更新:由于问题编辑已声明每行输入一次,因此您根本不需要sed部分。

答案 1 :(得分:1)

的Python:

from datetime import datetime

list = open("times.txt").read()
lasttime = None

for timestamp in [datetime.strptime(datestring, "%H:%M:%S") for datestring in list.split()]:
    if lasttime and (timestamp - lasttime).seconds > 30:
        print lasttime.time(),"and",timestamp.time()

    lasttime = timestamp

答案 2 :(得分:0)

红宝石:

File.open(filename,'r').each do |line|

times = split

times.each { |time| time = Time.parse(time) }
times.each_with_index do |time,i|


 puts time if ((time[i+1] - time [i]).sec > 30)

end

end

答案 3 :(得分:0)

在Python中:

data = open('filename').read()
times = [datetime.time(x) for x in data.split()]

for i in range(1, len(times)):
  if times[i] - times[i-1] > datetime.timedelta(seconds=30):
    print times[i], times[i-1]

答案 4 :(得分:0)

@OP,你的算法只是找到一种方法来迭代每个字段,将它们转换为秒,并与邻居进行比较。

gawk 'BEGIN{threshold=30}
{
 for(i=1;i<=NF;i++){
    m=split($i,t,":")
    n=split($(i+1),w,":")
    sec = (t[1]*3600) + (t[2]*60) + t[3]
    sec_next = (w[1]*3600) + (w[2]*60) + w[3]
    if ( (sec_next - sec) > threshold ){
        print $i, $(i+1)
    }
 }
}' file 

输出:

# ./shell.sh
10:14:02 10:14:41
10:14:46 10:17:58
10:18:00 10:19:10