2つのタイムスタンプ間の最大ミリ秒差を見つける方法は?

2つのタイムスタンプ間の最大ミリ秒差を見つける方法は?

私はシェルスクリプトに初めて触れました。私のスクリプトの鍵は、2つのタイムスタンプ間の最大ミリ秒差を見つけることです。次のように、タイムスタンプの内容を含むファイルがあります。

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

このように約30,000のレコードがあり、スクリプトを実行するときにパフォーマンスの問題があってはなりません。スクリプトを作成しようとすると、うるう年、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の答えでフレームワークを使用する(彼の答えにコメントを書くこともできますが、評判が十分ではありません):

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]")'

(各行を次,のように置き換え、.行を単語に分割して最初の2つの単語と最後の2つの単語からなる日付を解析し、違いを印刷します。)$_[0]$_[3]

関連情報