Использовать gawk, чтобы преобразовать удобочитаемое время в файле в Unix?

Я новичок в Gawk. Основываясь на этом потоке, я уже сделал функцию gawk для преобразования даты и времени, например, "07,JUN,2015,06,PM", во время Unix (миллисекунды):

$ cat tst.awk
function cvttime(t, a) {
    split(t,a,/[,: ]+/)

    # fa0,07,DEC,2014,10,AM,862.209018
    #  =>
    #    a[2] = "07"                date
    #    a[3] = "DEC"               month
    #    a[4] = "2014"              year
    #    a[5] = "06"                time
    #    a[6] = "AM"                AM/PM

    if ( (a[6] == "PM") && (a[5] < 12) ) {
        a[5] += 12
    }

    match("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",a[3])
    a[3] = (RSTART+2)/3

    return( a[1]","mktime(a[4]" "a[3]" "a[2]" "a[5]" 00 0")"000,"a[7])
}

BEGIN {
    mdt = "fa0,07,DEC,2014,10,AM,862.209018"    
    ms = cvttime(mdt)
    print ms
}

В терминале следующая команда дает мне правильное время Unix:

$ TZ=UTC gawk -f tst.awk

возвращает:

fa0,1417946400000,862.209018

Теперь у меня есть файл "input.csv", содержащий:

aa1,07,DEC,2014,06,AM,282.485988
ac3,07,DEC,2014,07,AM,97.6757181
ef3,07,DEC,2014,08,AM,112.816554
ag3,07,DEC,2014,09,AM,101.479961
fa0,07,DEC,2014,10,AM,862.209018

Как я должен изменить функцию gawk и команду оболочки, чтобы передать в "input.csv" и сгенерировать "output.csv", содержащий:

aa1,1417932000000,282.485988
ac3,1417935600000,97.6757181
ef3,1417939200000,112.816554
ag3,1417942800000,101.479961
fa0,1417946400000,862.209018

Заранее спасибо!

2 ответа

Вы можете использовать что-то вроде этого:

awk -F, '{"date -d "$3"\" \""$2"\" \""$5"\" \""$6"\" \""$4" '+%s'" | getline d; print $1","d"000,"$NF""}' input.csv > output.csv

или же

awk -F, '{"date -u -d "$3"\" \""$2"\" \""$5"\" \""$6"\" \""$4" '+%s'" | getline d; print $1","d"000,"$NF""}' input.csv > output.csv

Если вы хотите установить флаг -u с даты команды

-u, --utc, --universal распечатать или установить всемирное координированное время

Ну, это сбивает с толку, потому что ваше время ввода не совпадает с вашим временем вывода, но я думаю, что это делает то, что вы хотите:

BEGIN {
  FS = OFS = ","
}
{
  # fix year
  $4 += 2000
  # fix month
  match("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC", $3)
  $3 = (RSTART + 2) / 3
  # fix hour
  if ($6 == "PM" && $5 < 12)
    $5 += 12
  print $1, mktime($4 " " $3 " " $2 " " $5 " 0 0") * 1000, $NF
}
Другие вопросы по тегам