Получение строк, отформатированных как записи CSV, и преобразование в них с помощью sed
Когда я пытаюсь что-то получить, я получаю:
09:00:02.052(0.0000<-0.0001<-0.0002)
15:04:07.225(75.8901<-78.1234<-79.4567)
16:08:11.463(100.0000<-100.0000<-100.0000)
значения в () являются процентными, поэтому всегда лежат в [0, 100]
Поэтому формат ввода всегда будет таким:
HH:MM:SS.mmm(numbers1.xxxx<-numbers2.xxxx<-numbers3.xxxx)
И давайте предположим, что дата 20181025.
Можно ли преобразовать этот результат grep с помощью awk/ другой команды unix в формат csv, похожий на временную серию:
unixtimestamp1,0.0000,0.0001,0.0002
unixtimestamp2,75.8901,78.1234,79.4567
unixtimestamp3,100.0000,100.0000,100.0000
- Гарантируется, что номера всегда состоят из 4 цифр.
Спасибо!
1 ответ
Попробуйте эту строку:
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. Это расширение "GNU" для GNU.
Так что он может не работать вне коллекции GNU.