Отметка времени эпохи в файле CSV с GAWK
Нужно преобразовать удобочитаемые временные метки в эпоху /Unix в CSV-файле, используя GAWK при подготовке к загрузке в БД MySQL.
Пример данных:
{null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
Глядя на столбец 6, вторник, 26 ноября, 12:17, и переведите время в эпоху хранения. Все показанные времена будут в формате EST. Я понимаю, что AWK - инструмент для этого, но, похоже, я не могу структурировать команду. В настоящее время есть:
cat FILE_IN.CSV | awk 'BEGIN {FS=OFS=";"}{$6=strftime("%s")} {print}'
Однако это возвращает:
{null};2013-11-26;Text & Device;Location;/file/path/to/;1385848848;1;1385845647
Предположительно, это означает, что я звоню в текущее время эпохи (1385848848 была текущая эпоха во время выполнения) и не спрашиваю strftime
преобразовать строку; но я не могу представить другого способа сделать это.
Какой правильный синтаксис для gawk
/strftime
преобразовать существующую временную метку в эпоху?
Редактировать: Этот вопрос, похоже, тесно связан с тем, как я могу использовать вывод из awk в другой команде?
2 ответа
$ cat file
{null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
$ gawk 'BEGIN{FS=OFS=";"} {gsub(/-/," ",$2); $2=mktime($2" 0 0 0")}1' file
{null};1385445600;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
Вот как обычно конвертировать дату из любого формата в секунды, начиная с эпохи, используя ваш текущий формат в качестве примера и с комментариями, чтобы показать процесс преобразования шаг за шагом:
$ cat tst.awk
function cvttime(t, a) {
split(t,a,/[,: ]+/)
# 2013 Tuesday, November 26 10:17 PM
# =>
# a[1] = "2013"
# a[2] = "Tuesday"
# a[3] = "November"
# a[4] = "26"
# a[5] = "10"
# a[6] = "17"
# a[7] = "PM"
if ( (a[7] == "PM") && (a[5] < 12) ) {
a[5] += 12
}
# => a[5] = "22"
a[3] = substr(a[3],1,3)
# => a[3] = "Nov"
match("JanFebMarAprMayJunJulAugSepOctNovDec",a[3])
a[3] = (RSTART+2)/3
# => a[3] = 11
return( mktime(a[1]" "a[3]" "a[4]" "a[5]" "a[6]" 0") )
}
BEGIN {
mdt ="Tuesday, November 26 10:17 PM"
secs = cvttime(2013" "mdt)
dt = strftime("%Y-%m-%d %H:%M:%S",secs)
print mdt ORS "\t-> " secs ORS "\t\t-> " dt
}
$ awk -f tst.awk
Tuesday, November 26 10:17 PM
-> 1385525820
-> 2013-11-26 22:17:00
Я уверен, что вы можете изменить это для текущей проблемы.
Также, если у вас нет gawk, вы можете написать функцию cvttime() как (loaning @sputnik's date
командная строка):
$ cat tst2.awk
function cvttime(t, cmd,secs) {
cmd = "date -d \"" t "\" '+%s'"
cmd | getline secs
close(cmd)
return secs
}
BEGIN {
mdt ="Tuesday, November 26 10:17 PM"
secs = cvttime(mdt)
dt = strftime("%Y-%m-%d %H:%M:%S",secs)
print mdt ORS "\t-> " secs ORS "\t\t-> " dt
}
$
$ awk -f tst2.awk
Tuesday, November 26 10:17 PM
-> 1385525820
-> 2013-11-26 22:17:00
Я оставил srtftime() там, чтобы показать, что секунды были правильными - замените на date
как вы считаете нужным.
Для версии без gawk вам просто нужно выяснить, как получить год во входной строке месяц / дата / время таким образом, чтобы date
понимает, если это имеет значение для вас - не должно быть трудно.
Вы можете преобразовать дату в эпоху с помощью этого фрагмента:
$ date -d 'Tuesday, November 26 12:17 PM' +%s
1385464620
Итак, наконец:
awk -F";" '{system("date -d \""$6"\" '+%s'")}' file
Спасибо @Keiron за фрагмент.