Получение строк, отформатированных как записи в формате CSV, и преобразование в них с помощью sed - PullRequest
0 голосов
/ 25 октября 2018

Когда я пытаюсь что-то найти, я получаю:

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, похожий на timeseries:

unixtimestamp1,0.0000,0.0001,0.0002
unixtimestamp2,75.8901,78.1234,79.4567
unixtimestamp3,100.0000,100.0000,100.0000
  • Гарантируется, что числа всегда состоят из 4 цифр.

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Попробуйте эту строку:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...