쉘 스크립팅을 처음 사용합니다. 내 스크립트의 핵심은 두 타임 스탬프 사이의 차이를 밀리 초까지 찾는 것입니다. 나와 함께 타임 스탬프 내용이있는 파일 만
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 일이있는 달 등 많은 요인이 나타납니다.
누구든지 도와주세요.
답변
복잡한 파싱을 할 필요가 없습니다. 데이트 는 친구 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
는 IS 에포크 시간 (2038-01-19 보낸 초)%N
이다 나노초$(( ))
그리고 산술을(( ))
위해bash
, http://mywiki.wooledge.org/ArithmeticExpression을 참조 하십시오$( )
~의 약자command substitution
이것도 당신의 필요에 맞습니까?
답변
Perl, Python 또는 Ruby와 같은 스크립팅 언어는 빠르며 노력이 거의 필요하지 않습니다. 예를 들어, Perl 및 Date :: Parse :
perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'
(각 줄에 대해로 바꾸고 ,
를 통해 .
줄로 나누고 처음 두 단어와 다음 두 단어로 구성된 날짜를 구문 분석 한 다음 차이를 인쇄하십시오.)$_[0]
$_[3]
답변
방금이 게시물을 date
보았습니다. 적어도 오늘은 더 간단한 기반의 솔루션이 있습니다. @Gilles Quenot의 답변에 프레임 워크를 사용하면 (그의 anwser에게 의견을 쓰지 만 평판이 충분하지는 않습니다) :
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
밀리 초에 출력을 자릅니다.