ミリ秒までの2つのタイムスタンプの違いを見つける方法は?


10

シェルスクリプトは初めてです。私のスクリプトの中心は、ミリ秒までの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

このように、スクリプトを実行するときにパフォーマンスの問題に直面してはならない約30kのレコードがあります。うるう年、31日の月など、多くの要因がこのためのスクリプトを記述しようとしているときに思い浮かびます。

誰かが私を助けてくれますか?


1
DSTは画像に含まれますか?うるう秒?DSTルールとは何ですか?彼らはあなたの国で時間とともに変化しましたか?1970年より前の日付、またはグレゴリオ暦に切り替える前の日付を処理する必要がありますか?
ステファンChazelas

回答:


13

複雑な解析を行う必要はありません。は、彼の友人である助けを借りて、すべての魔法を実行します。

#!/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

これもあなたのニーズに合っていますか?


1
arithhmeticエラー(秒とナノ秒の連結)を修正しました。今私は最初に秒を計算します(OPはそれを要求しませんが、再利用における完全性と堅牢性のために)
Gilles Quenot '20

0

Perl、Python、Rubyなどのスクリプト言語は高速で、ほとんど労力を必要としません。たとえば、PerlとDate :: Parseの場合

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(各ラインについて、置き換える,ことによって.単語に行を分割し、$_[0]通って$_[3]最初の二つによって形成された日付と次の2つの単語を解析し、その差を印刷します。)


「小さな努力」はかなり相対的です。もちろん、もしあなたがXプログラマーでYライブラリーを知っているなら、それは簡単なことです。いつもそうです。実際、Pythonプログラマーがまだここに参加していないことに驚いています。時間の問題だと思います...:-\
Mike S

それが人々がここで完全な解決策を与える理由です。そうすれば、Xプログラマである必要も、Yライブラリについて知っている必要もありません。そして、あなたはまだあなたのスクリプトで1行を持つ「少しの努力」の恩恵を受けない10
CherryDT

0

私はこの投稿に出くわしました。少なくとも今日-より簡単な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を使用すると、出力がミリ秒に切り捨てられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.