web-dev-qa-db-ja.com

ミリ秒までの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

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

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

10
Vamshi G

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

_#!/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_はEpoch時間(1970年1月1日からの秒数)
  • _%N_はナノ秒
  • $(( ))および_(( ))_はbash算術用です http://mywiki.wooledge.org/ArithmeticExpression を参照してください
  • $( )は_command substitution_の略です

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

13
Gilles Quenot

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

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

(各行について、, 沿って .、行を単語に分割$_[0] 使って $_[3]、最初の2語と次の2語によって形成された日付を解析し、違いを出力します。)