Используя GNU awk, любые преобразования даты должны выполняться с предоставленными функциями даты.Две полезные функции времени для этой задачи: mktime
и strftime
:
mktime(datespec)
: это преобразует строку спецификации даты,datespec
в форме YYYY MM DD hh mm ss
во время эпохи Unix, т.е. общее количество секунд с 1970 г. 01 01 UTC.Начиная с gawk-4.2.1 вы можете использовать utc-flag
, чтобы указать, что datespec
находится в UTC или нет.
strftime(format,timestamp)
: это преобразовывает эпоху-time timestamp
в форматированную строку (такое же форматирование, как у команды date
).Вы можете использовать utc-flag
, чтобы указать, что возвращаемое время должно быть в UTC или в местном часовом поясе.
Подробнее в руководстве GNU awk
Код становится теперь: convert.awk
BEGIN {FS=OFS="|"}
{ d=$4
time=mktime(substr(d,1,4)" "substr(d,5,2)+1-$5" "substr(d,7,2)" 00 00 00")
$5=strftime("%Y%m%d",time)
print
}' file
, и вы запускаете это с:
$ awk -f convert.awk file.txt
mktime
замечательно добавка.Поэтому строка, которую вы передаете в форме YYYY MM DD hh mm ss
, не обязательно должна быть правильной датой, вы можете иметь неверные значения.Например, строка 2019 01 32 00 00 00
эквивалентна 2019 02 01 00 00 00
и 2019 5 -10 00 00 00
эквивалентна 2019 04 20 00 00 00
, а еще больше 2019 -19 -10 00 00
эквивалентна 2017 04 20 00 00
Примечание: , посколькумы изменяем время непосредственно в mktime
, нам не нужно беспокоиться о переходе на летнее время (см. комментарий).