Использование awk mktime для преобразования полей даты и времени в Epoch в cvs - PullRequest
1 голос
/ 06 февраля 2020

У меня есть CSV-файл, который содержит около 6 миллионов отдельных строк

    1,2018-11-25 23:00:26,403,74
    1,2018-11-25 23:02:10,406,68
    1,2018-11-25 23:04:19,448,108
    1,2018-11-25 23:05:26,417,79
    1,2018-11-25 23:05:30,378,80
    1,2018-11-25 23:05:31,360,78
    1,2018-11-25 23:06:45,391,79
    1,2018-11-25 23:06:50,432,76

Это время UT C, я живу в Европе UT C + 1. Я написал 'мой первый скрипт AWK: test.awk:

    BEGIN { FS=",";OFS="\t"}
    {
        $2 = mktime(gensub(/[-:]/,"  ","g",$2))

        print
    }

Когда я запускаю:

      $ awk -f test.awk mark.csv

Это дает вывод:

    1   1543183226  403 74
    1   1543183330  406 68
    1   1543183459  448 108
    1   1543183526  417 79
    1   1543183530  378 80
    1   1543183531  360 78
    1   1543183605  391 79
    1   1543183610  432 76

Выглядит нормально, но проблема в том, что эпоха на один час раньше

    1543183226≠2018-11-25 23:00:26 but 1543183226=2018-11-25 22:00:26

Чтобы решить эту проблему, я смотрю на

    strftime([format [, timestamp[, utc-flag]]])

Я почти на месте, но я мог бы воспользоваться некоторой помощью.

Спасибо

Ответы [ 2 ]

6 голосов
/ 06 февраля 2020

Просто установите переменную часового пояса (TZ) на UTC перед вызовом awk или установите флаг UT C для mktime ():

$ awk 'BEGIN{print mktime("2018 11 25 23 00 26")}'
1543208426

$ TZ=UTC awk 'BEGIN{print mktime("2018 11 25 23 00 26")}'
1543186826

$ awk 'BEGIN{print mktime("2018 11 25 23 00 26",1)}'
1543186826

$ awk 'BEGIN{print mktime("2018 11 25 22 00 26",1)}'
1543183226
1 голос
/ 06 февраля 2020

РЕДАКТИРОВАТЬ: Принимая ссылки из кода Эд сэр и применяя в этом коде.

TZ=UTC awk '
BEGIN{
  FS=","
  OFS="\t"
}
{
  $2 = mktime(gensub(/[-:]/,"  ","g",$2))
  print $2
}'  Input_file


Не могли бы вы попробовать следующее. Поскольку 1 час имеет 3600 секунд, то, что я сделал, отправив значение $ 2 на strftime, вычел его значение, и мы получили значение на 1 час раньше (этот подход не является гибким, следует использовать только приведенный выше код) .

awk '
BEGIN{
  FS=","
  OFS="\t"
}
{
  $2 = mktime(gensub(/[-:]/,"  ","g",$2))
  print strftime("%Y-%m-%d %H:%M:%S",$2-3600)
}'  Input_file

Вывод первой строки теперь будет 2018-11-25 22:00:26.

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