Похоже, в вопросе предлагается переместить серию временных меток abs в относительные метки времени, используя 'baseval' в качестве нулевой точки времени.
Можно использовать команду date (используя '+% S 'чтобы получить секунды прошедшей эпохи), чтобы упростить вычисление. Если в файле много строк, это решение может быть не идеальным, поскольку оно вызывает процесс 'date' для каждой строки.
Стоит отметить, что некоторые сложности связаны с синтаксическим анализом входного формата - комбинация фиксированных + разделенных столбец. Код использует bash IFS для разделения строки на компоненты.
#! /bin/bash
function relative_time_ms {
# Convert inputinto two tokens - relative seconds + nanoseconds
local dd=($(date '+%s %N' -d "$1"))
echo $((dd[0]*1000 + dd[1]/1000000 - baseval))
}
while IFS='|' read x ts msg ; do
rel_time=$(relative_time_ms "$ts")
echo "$rel_time | $msg"
done < file.log
Вывод:
0 | message 1
1000 | hi these
-240000 | do stuff now!