Ваша проблема в том, что вы передаете слишком много данных в date
с помощью xargs
. Кроме того, вы не передаете дополнительную текстовую строку в конце, чтобы сделать ее частью вывода.
Было бы лучше сделать всю операцию в скрипте awk
. Как в GNU awk
, так и в mawk
есть функции для основных манипуляций с отметками времени :
{
YYYY = substr($1, 1, 4) # year
mm = substr($1, 5, 2) # month
dd = substr($1, 7, 2) # day
HH = substr($1, 9, 2) # hour
MM = substr($1, 11, 2) # minute
SS = substr($1, 13, 2) # seconds
sss = substr($1, 15, 3) # fractional seconds
text = substr($1, 18) # the rest
tm = mktime(sprintf("%s %s %s %s %s %s", YYYY, mm, dd, HH, MM, SS))
printf("%s.%s %s\n", strftime("%Y-%m-%dT%H:%M:%S", tm, 1), sss, text)
}
Это выделяет различные компоненты входной временной метки в различные переменные, используя substr()
. Затем время Unix вычисляется с использованием mktime()
(. Предполагается, что входное время находится в местном часовом поясе ), и оно преобразуется в строку временной метки (UTC )в соответствующем формате с использованием strftime()
.
Обратите внимание, что доли секунды(sss
в коде )никогда не являются частью вычислений времени, а вместо этого просто передаются как есть из ввода в вывод.
Запуск:
$ awk -f script.awk file
2019-10-14T14:16:53.042 nmd
2019-10-14T14:16:53.052 egc
2019-10-04T06:19:01.490 egc
2019-10-04T06:19:01.493 nex
2019-10-04T06:19:01.497 nex
2019-10-04T06:19:02.531 nex
2019-10-04T06:19:02.534 ksd
См. документацию по mktime()
и strftime()
в вашем руководстве awk
.
Это версия с использованием sed и bash
sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})(([0-9]{3,}){0,1})([a-z].*)$/D="\1\ \2:\3:\4";M="\5";E="\7"/' /tmp/tmpfile |\
xargs -d'\n' -I=:= bash -c '(=:=;echo $(date -u +"%Y-%m-%dT%H:%M:%S.$M" -d "TZ=\"America/New_York\" $D" ) $E)'
я сделал только 1 шаг, чтобы избежатьawk + sed
я удалил все \
во второй части sed
я использую параметр -I
xargs, чтобы указать, где я буду использовать свой аргумент, например {}
вfind
чтобы не использовать дату дважды, я использую опцию TZ
в опции -d
даты
Здесь я использую America/New_York
в качестве часового пояса для ввода, вы должны изменить его на правильное значение.