두 타임스탬프 간의 최대 밀리초 차이를 찾는 방법은 무엇입니까?

두 타임스탬프 간의 최대 밀리초 차이를 찾는 방법은 무엇입니까?

저는 쉘 스크립팅을 처음 접했습니다. 내 스크립트의 핵심은 두 타임스탬프 간의 최대 밀리초 차이를 찾는 것입니다. 다음과 같이 타임스탬프 내용이 포함된 파일이 있습니다.

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

(각 줄을 다음 ,으로 바꾸고, .줄을 단어로 나누어 처음 두 단어와 마지막 두 단어로 구성된 날짜를 구문 분석하고 차이를 인쇄합니다.)$_[0]$_[3]

관련 정보