我在文本文件中有一个时间戳列表。我想弄清楚变化超过给定阈值的时间。
输入格式:
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中的解决方案会很有帮助。感谢。
答案 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
以下是它的工作原理:
:
以便于提取。NR==1
)时,它只存储时间(s=$0
)和自午夜(s1=$1*3600+$2*60+$3
)以来的秒数。这是第一个基线。NR>1
),它获取自午夜(t1=$1*3600+$2*60+$3
)以来的秒数,如果距离最后一次超过30秒,则输出最后一次和此时间({{1 }})。if (t1-s1 > 30) print s" "$0
)的基线。请记住,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