
私はシェルスクリプトに初めて触れました。私のスクリプトの鍵は、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]