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