2017-01-22 77 views
7

Mam plik zawierający zestaw znaczników czasu w formacie H:M:S.MS, mogę czytać i drukować wszystkie zapisane znaczniki czasu, ale kiedy wykonuję operację arytmetyczną, taką jak Odejmowanie (na przykład Timestamp2 - Timestamp1), to nie robi. t daj mi odpowiedź, nie mam doświadczenia w pracy z programowaniem skryptów bash.Odejmowanie dwóch znaczników czasu w skrypcie basha

Wszelkie sugestie, zalecenia będą mile widziane.

Oto screen shot mojego problemu.

Oto przykład:

Start Time = 17:53:01.166721 
End Time = 17:53:01.369787 

Oczekiwany wynik dla End Time - Start Time jest albo 0:00:0.203066 lub 0.203066.

+0

W jaki sposób uzyskujesz znaczniki czasu? może mamy tutaj problem XY: czy próbujesz zrobić czas na proces? –

+1

Proszę dodać przykładowe dane wejściowe i żądane dane wyjściowe dla tego przykładowego wejścia do pytania. – Cyrus

+0

Czy masz dostęp do daty GNU? – Cyrus

Odpowiedz

7

Jeśli chcesz przetworzyć datę za pomocą prostych narzędzi wiersza poleceń, trzeba konwertować timestampów na niektóre łatwe do czynienia z-formatu, jak epoka oparte.

Można to zrobić za pomocą polecenia date, które można zawinąć w funkcji tak:

timestamp() { 
    date '+%s%N' --date="$1" 
} 
# timestamp "12:20:45.12345" ==> 1485105645123450000 

Następnie można odjąć je bezpośrednio:

echo $(($(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}"))) 

Zauważ, że skoro nie jesteś śledzenie dnia, ale tylko czasu, będziesz mieć błędy, gdy na przykład czas rozpoczęcia wynosi 23:59:59, a czas zakończenia to 00:00:01.

0

Zakładając, że zmienne są liczbami całkowitymi, należy załączyć obliczenia w arytmetycznej ocenie, aby działało.

echo $((VAR1 - VAR2)) 

Albo, jeśli chcesz przypisać wartość:

VAR3=$((VAR1 - VAR2)) 
+0

Nie potrzebujesz symbolu $ dla zmiennych w kontekście (()). – Inian

+0

Dziękuję Fred ... – Ali

+0

Dziękuję Inian ... – Ali

0

Jeśli trzeba użyć bash, trzeba konwertować znacznik czasu do liczby całkowitej:

$ time="12:34:56.789" 
$ IFS=":." read -r h m s ms <<<"$time" 
$ echo $h $m $s $ms 
12 34 56 789 
$ milliseconds=$(((h*3600 + m*60 + s)*1000 + ms)) 
$ echo $milliseconds 
45296789 

Następnie można odjąć, aby uzyskać liczbę milisekund reprezentujących różnicę.

Konwersja do sekund z jakiegoś arytmetycznej i strun budowy:

$ seconds="$((milliseconds/1000)).$((milliseconds % 1000))" 
$ echo $seconds 
45296.789 

Aby rozwiązać gniourf_gniourf za ważny punkt (w przylegający sposób):

$ time="12:34:56.7" 
$ IFS=":." read -r h m s ms <<<"$time" 
$ ms="${ms}000"; ms=${ms:0:3} 
$ echo $h $m $s $ms 
12 34 56 700 
# .......^^^ 

także ciągi są niepoprawne liczby ósemkowe, takie jak "08" i "09", będą powodować błędy w arytmetyce basha, więc jawnie deklaruj, że są Podstawa 10

milliseconds=$(((10#$h*3600 + 10#$m*60 + 10#$s)*1000 + 10#$ms)) 
+0

Działa to tylko wtedy, gdy po okresie dziesiętnym są 3 cyfry. –

+0

Dziękuję bardzo glenn Jackman – Ali

Powiązane problemy