Переформатируйте дату в отметку времени unix в таблице csv

Переформатируйте дату в отметку времени unix в таблице csv

У меня есть .csvфайл, содержащий дату и время в формате 01/20/2016 23:53:01в первом столбце. Мои столбцы разделены точкой с запятой, т.е.

01/21/2016 03:03:01;18616;0;1
01/21/2016 03:13:01;29040;36553;2

НаТАКЯ нашел команду bash

date -d '06/12/2012 07:21:22' +"%s" 

который работает для того, что я хочу. Я сейчас пытаюсь интегрировать с, awkчтобы заменить первый столбец. Я нашелответ на похожую проблему:

awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json

Который я пытался адаптировать к своим собственным данным. Но я получал пустой вывод.

решение1

Я наконец-то увернулся, пока писал вопрос. Так что вот мое решение:

awk -F';' -v OFS=';'  '$1 {cmd="date -d \""$1"\" +%s"; cmd | getline $1; close(cmd)} 1' datetime.csv > unix.csv

Это произошло по двум причинам: я пропустил « "on» +%s"и в моем вводе была прервана строка.

решение2

GNU date имеет -fопцию для преобразования дат, считанных из файла, построчно. Если ваш файл длинный, это будет быстрее, чем вызывать dateпо одному разу на строку. Дата должна быть одна на строке; поэтому план состоит в том, чтобы изолировать первый столбец ( cut -d \; -f 1), пропустить его date -f -для выполнения преобразования ивставитьрезультат с оставшимися столбцами.

paste -d \; <(<input cut -d \; -f 1 | date -f - +%s) <(<input cut -d \; -f 2-)

Это предполагает, что ваша оболочка поддерживаетзамена процесса(ksh93, bash, zsh). С помощью plain shв варианте Unix, который поддерживает /dev/fd(большинство поддерживает), вы можете использовать перетасовку дескрипторов файлов:

<input cut -d \; -f 2- | {
  exec 3<&0
  <input cut -d \; -f 1 | date -f - +%s | paste -d \; - /dev/fd/3
}

решение3

Хмммм. Ладно, это было давно, но я думаю, что стоит вставить предложение.

Я почти уверен, что вызов «date» для каждой строки файла в оболочке может оказаться немного медленным, если строк много.

Я собирался перейти к скрипту, который я написал для обработки записей табеля учета рабочего времени, извлеченных из Google Calendar, и вывести HTML, чтобы затем преобразовать его в счет-фактуру PDF. Но потом разговор об этом стал слишком длинным. Поэтому я просто дам вам код, чтобы сэкономить на чтении.

Я использую функции AWK gensub и mktime [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html]. Функция mktime ожидает ввода в формате datespec "YYYY MM DD HH MM SS [DST]", поэтому ваш ввод должен быть смещен, и здесь вступает в дело функция gensub. Вот что у меня есть для вас...

awk -F';' -v OFS=';' '{ $1=mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)); } 1' datetime.csv > unix.csv

Я бы сделал это немного по-другому и вывел бы отдельные аргументы в print вместо того, чтобы писать обратно в первый аргумент. Чуть больше самодокументирования ;) ТИМТОВТДИ

awk -F';' -v OFS=';' '{ print mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)), $2, $3, $4; }' datetime.csv > unix.csv

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

Надеюсь, это поможет вам или кому-то еще, кто смотрит на ту же проблему.

Связанный контент