Получение строк, отформатированных как записи 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.

Другие вопросы по тегам