У меня есть .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
Я знаю, что скрипт немного более многословен, но, надеюсь, он более производительный.
Надеюсь, это поможет вам или кому-то еще, кто смотрит на ту же проблему.