
아래와 같이 파일의 타임스탬프를 grep합니다. 이제 시차를 계산해야 합니다.
파일 데이터:
18:29:10
04:56:50
다음 명령을 실행해 보았지만 출력이 부정적입니다.
awk -F":" 'FNR==1{split($0,a,":");sec1=a[1]*3600+a[2]*60+a[3]} FNR==2{split($0,b,":");sec2=b[1]*3600+b[2]*60+b[3];val=sec2-sec1;ho=int(val/3600);val=val%3600;mi=sprintf("%02d",(val/60));val=val%60;;print ho":"mi":"val}' file.txt
출력은 다음과 같습니다: -13:-32:-10
내가 원하는 출력은 다음과 같습니다. 10:27:40
답변1
GNU 날짜를 사용하세요:
string1="18:29:10"
string2="04:56:50"
StartDate=$(date -u -d "$string1" +"%s")
FinalDate=$(date -u -d "$string2" +"%s")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S"
산출:
10:27:40
답변2
당신이 10:27:40을 의미한다고 가정
awk -F: '
{t[NR] = $3 + 60 * ($2 + 60 * $1)}
END{
d = t[2] - t[1]
if (d < 0) d += 86400
h = d / 3600
d %= 3600
m = d / 60
s = d % 60
printf "%02d:%02d:%02d\n", h, m, s
}'
답변3
재미로 다음을 사용하십시오 dc
.
$ cat file.txt
18:29:10
04:56:50
$ tr : \ <file.txt | dc -f - -e 'r60*+r60d**+r-r60*-r60d**-60dod24**+p'
10 27 40
$
이것은 내 첫 번째 dc
스크립트입니다. 재미있는 학습 경험.
또 다른 사용 방법 dc
:
$ cat file.txt
18:29:10
04:56:50
$ cat time_subtract.dc
[r60*+r60d**+]sb60d24**sd[ld+d0>n]snlbxsflbx_1*lf+60od0>np
$ tr : \ <file.txt | dc -f - -f time_subtract.dc
10 27 40
$
./script.sh file.txt
마지막으로 or 로 실행할 수 있도록 쉘 스크립트로 멋지게 포장했습니다 some pipeline | ./script.sh
.
#!/bin/sh
cat "$@" |
tr : ' ' |
dc -e '
[60+Lm1-Sm]SS
[60+Lh1-Sh]SM
[24+]SH
?SsSmSh
?SsSmSh
LsLs- d0>S Ss
LmLm- d0>M Sm
LhLh- d0>H Sh
[
]Ls[:]Lm[:]Lh
nnnnnn
'