2009-09-24 4 views
0

у меня есть два поля в моем текстовом файле, которыесценарий, чтобы получить среднее значение на основе временных меток

timestamp number 

Формат метки времени чч: мм: СС.ммм

некоторые примеры записей

18: 31: 48,345 0,00345

18: 31: 49,153 0,0

18,32: 23,399 0,33 456

Я хочу распечатать средние записи, не превышающие 30 секунд. что является хорошим и быстрым способом сделать это

+0

Должен ли быть сценарий bash? Сценарий Python будет довольно простым. – Joril

+0

Это может быть скрипт python – randomThought

ответ

1

Это отправная точка для awk. Я знаю, что вы можете оптимизировать код лучше.

count == 0 { startTime = timeToSeconds($1) } 
{ currentTime = timeToSeconds($1) 
    elapsedTime = currentTime - startTime 
    if (elapsedTime > 30.0) { 
     calculateAverage() 
     startTime = timeToSeconds($1) 
    } 
    print 
    sum += $2 
    count++ 
} 
END { calculateAverage() } 
function timeToSeconds(timeString) { 
    # Convert a time string to number of seconds 
    split(timeString, tokens, ":") 
    seconds = tokens[1]*3600.0 + tokens[2]*60.0 + tokens[3] 
    return seconds 
} 
function calculateAverage() { 
    # Use & modify global vars: count, sum 
    average = sum/count 
    printf "Average: %.4g\n\n", average 
    sum = 0.0; count = 0 
} 
0

Я бы начал с использования некоторого языка сценариев, который имеет встроенные операции «день/время». Например, в Ruby, вы можете легко сделать:

require 'time' 

t,n = gets.chomp.split(/\s+/) 
ts1 = Time.parse(t) 

# ... 

t,n = gets.chomp.split(/\s+/) 
ts2 = Time.parse(t) 

который теперь позволяет вам делать такие вещи, как:

diff = ts2 - ts1 
if diff > 30 
    # difference is greater than 30 seconds 
end 

рубин Time объектов могут быть использованы в контексте (с плавающей точкой, межд, String и т.д.) поэтому тривиально начинать выполнять вычисления, как если бы анализируемые даты были фактически числовыми значениями.

Смежные вопросы