2013-12-16 4 views
0

Я пишу сценарий оболочки, который анализирует файл CSV и выполняет некоторые вычисления.Сравнение двух временных меток внутри второго

Временные метки указаны в форме: HH:MM:SSS.sss и хранятся в переменных: $t2 и $t1.

Я хотел бы знать разницу между этими двумя марками (она всегда будет меньше, чем за одну секунду), и сообщать об этом как $t3 в секундах (т.е. 0.020)

t3=$t2-$t1 

Но приведенный выше код просто печать двух переменных со знаком минус между - как мне сравнить две метки времени?

ответ

1

Вот напуганный способ сделать это! Сбросьте все целые секунды, чтобы получить миллисекунды. Сделайте вычитание. Если результат отрицательный, это потому, что секунды переполнены, поэтому добавьте обратно в 1000 мс. Слот десятичной точки спереди, чтобы сделать секунды с миллисекунд.

#!/bin/bash -xv 
t1="00:00:02.001" 
t2="00:00:03.081" 
ms1=${t1/*\./} 
ms2=${t2/*\./} 
t3=$((10#$ms2-10#$ms1)) 
[[ $t3 < 0 ]] && t3=$((t3+1000)) 
t3=$(echo "scale=3; $t3/1000"|bc) 
echo $t3 
+0

Это почти сработало, я делаю следующую ошибку: './parser.sh: 081: слишком большое значение для базы (маркер ошибки -« 081 »)' - любые идеи? –

+0

Попробуйте запустить скрипт, используя «bash -xv ./parser.sh», чтобы включить отладку. –

+0

Скопируйте сценарий и повторите попытку, я, кажется, потерял косую черту в переводах по строкам 3 и 4. –

0

Вы можете использовать AWK математику, чтобы вычислить эту разницу в 2-х временных меток после преобразования как временные метки, чтобы их милли-второе значение:

t1=04:13:32.234 
t2=04:13:32.258 
awk -F '[ :.]+' '{ 
    t1=($1*60*60 + $2*60 + $3)*1000 + $4 
    t2=($5*60*60 + $6*60 + $7)*1000 + $8 
    print (t2-t1)/60}' <<< "$t1 $t2" 
0.4 

формула, используемая для преобразования:

timestamp value (ms) = (hour * 60 * 60 + minute * 60 + second) * 1000 + milli-second 
Смежные вопросы