我是 shell 脚本新手。我的脚本的核心是找出两个时间戳之间最多毫秒的差异。我有一个包含时间戳内容的文件,仅作为
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447
像这样,我有大约 30k 记录,当我执行脚本时,我不应该遇到任何性能问题。当我尝试为此编写脚本时,会考虑到许多因素,例如闰年、有 31 天的月份等。
有人可以帮我解决这个问题吗?
答案1
不需要做复杂的解析,日期会在他朋友的帮助下为你施展所有魔法,巴什:
#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
secdiff=$((
$(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
))
nanosecdiff=$((
$(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
))
printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
(secdiff * 1000) + (nanosecdiff / 1000000)
))
done < YOUR_FILE.txt
输出
2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds
看man date
笔记
date -d
非常有用,它转换时间戳%s
是个时代时间(自 1970 年 1 月 1 日以来的秒数)%N
是纳秒$(( ))
用于(( ))
算术bash
,请参见http://mywiki.wooledge.org/ArithmeticExpression$( )
代表command substitution
这也符合您的需求吗?
答案2
我刚刚看到这篇文章,至少在今天有一个更简单的date
解决方案。在 @Gilles Quenot 的回答中使用该框架(本来可以给他的 anwser 写一条评论,但声誉不够):
while read d1_1 d1_2 d2_1 d2_2
do
date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END
结果:
$ ./time_elapsed.sh
0.007000000
使用%3N
代替%N
会将输出截断为毫秒。
答案3
Perl、Python 或 Ruby 等脚本语言速度很快,而且不需要太多努力。例如,使用 Perl 和日期::解析:
perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'
(对于每一行,替换,
为,通过.
将该行拆分为单词,解析前两个单词和后两个单词形成的日期,并打印差异。)$_[0]
$_[3]