Как отформатировать число с помощью скрипта оболочки - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть текстовый документ со следующим содержанием:

[ForwardTimer],__fc_layer_1__,[Span:1ms970us]
[ForwardTimer],__batch_norm_2__,[Span:5ms64us]
[ForwardTimer],__batch_norm_3__,[Span:5ms87us]

Я хочу преобразовать значения времени в единицах мс, например,

[ForwardTimer],__fc_layer_1__,1.970ms
[ForwardTimer],__batch_norm_2__,5.064ms
[ForwardTimer],__batch_norm_3__,5.087ms

, оставив предыдущие слова без изменений.Как я могу обработать документ с помощью сценария оболочки, особенно с помощью команды sed или awk?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Это может работать для вас (GNU sed):

sed -E 's/\[Span:([0-9]*)([^0-9]*)([0-9]*)[^]]*[]]/\1.\n\3\2/;:a;/\n[0-9]{3}/!s/\n/&0/;ta;s/\n//' file

Используйте сопоставление с образцом и обратные ссылки для достижения желаемого результата.

Не забывая обнулить десятичную часть соответствия, используя цикл и введенную новую строку, которая по завершении удаляется.

Первая команда замещения фокусируется на такой строке, как [Span:5ms64us]и если найдены группы 5 в обратной ссылке 1, ms в обратной ссылке 2 и 64 в обратной ссылке 3. Они преобразуются в \1.\n\3\2, то есть 5.\n64ms, а остальная часть исходной строки удаляется.

Вторая часть сценария sed обнуляет десятичную часть обратной ссылки 3 длиной 3 цифры с ведущими нулями.Используя \n в качестве маркера, если числовые цифры, следующие за \n, имеют длину менее 3, к \n добавляется 0 и проверка повторяется.После того, как проверка прошла, т. Е. Есть 3 цифры, \n удаляется и обработка завершается.

0 голосов
/ 24 декабря 2018
awk -F '\\[Span:' '{split($2,array,"ms|us"); printf("%s%s.%03dms\n",$1,array[1],array[2])}' file.txt

Вывод:

[ForwardTimer],__fc_layer_1__,1.970ms
[ForwardTimer],__batch_norm_2__,5.064ms
[ForwardTimer],__batch_norm_3__,5.087ms

Это разделяет ваши строки с [Span: в качестве разделителя полей на две части ($1 и $2).С функциями split() и ms или us в качестве разделителя полей он разделяет $2 на три части (array[1], array[2] и array[3]).array[3] не используется.Форматированный вывод тогда составляет printf().

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