Попробуйте эту строку:
sed 's/^\(.\+\).(\(.\+\)<-\(.\+\)<-\(.\+\)./printf "%.3f,%s,%s,%s" "$(date --date="\1" +"%s.%N")" \2 \3 \4/e'
Вывод получен:
1540537202.050,0.0000,0.0001,0.0002
1540559047.220,75.8901,78.1234,79.4567
1540562891.460,100.0000,100.0000,100.0000
Примечание: я предположил, что ваши форматы локализации (LC_ALL
) плавают с точкой, а не с запятой.В противном случае установите эту переменную перед командой sed:
LC_ALL=C sed 's/^\(.\+\).(\(.\+\)<-\(.\+\)<-\(.\+\)./printf "%.3f,%s,%s,%s" "$(date --date="\1" +"%s.%N")" \2 \3 \4/e'
Чтобы получить метку времени из строки даты и времени, вы можете использовать команду date.См. этот ответ SO для получения более подробной информации.
Чтобы выполнить эту команду с первой захваченной группой (датой), я использовал флаг sed e
, вдохновленный этой SOответить .Это позволяет sed получать ввод переданной команды оболочки.
Дополнительная информация по info sed
(сценарии 'sed' -> Команда "s"):
Эта командапозволяет передать данные из командной оболочки в шаблонное пространство.Если была сделана подстановка, выполняется команда, найденная в пространстве шаблонов, и пространство шаблонов заменяется ее выводом.Завершающий перевод новой строки подавлен;результаты не определены, если команда, которая должна быть выполнена, содержит символ NUL. Это расширение sed для GNU.
Так что оно может не работать вне коллекции GNU.