2016-03-17 6 views
0

У меня есть CSV, в котором 2-й и 3-й столбцы - это дата и время (в UTC) соответственно.Передача переменной awk в strftime

Id,Date,Hour,Name,... 
1,2016-02-01,13:52,name1,... 
2,2016-02-01,11:02,name2,... 
3,2016-01-30,17:43,name3,... 
4,2016-01-29,20:07,name4,... 
5,2016-01-29,20:05,name5,... 
. 
. 
. 

Мне нужно конвертировать и объединить это в Германии (обобщенное, CET/CEST). Я конкатенация первых 2-го и 3-го столбца в переменный AWK как a, но у меня есть проблема, проходящее это в качестве второго аргумента функционировать strftime:

TZ="Europe/Berlin" awk 'BEGIN { FS=OFS=","} NR!=1 {a=$2" "$3" UTC"} {print strftime("%F %H.%M.%S %Z", a)}' <csv-file> 

Как пройти AWK переменной a в пределах strftime функций?

+0

Поместив 'a' в ту же область, где вы пытаетесь его использовать? –

ответ

1

Прежде всего, AWK является мощным инструментом для обработки текста, однако, на дату и время, это не так хорошо.

Если вы хотите использовать его strftime(), вам необходимо предоставить awk принятый timestamp, например, из awk's systime() or mktime(). Однако, если вы хотите сделать изменение часового пояса, mktime() вы не можете взять. Потому что он загрузит datespec в ваш местный часовой пояс.

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

Я предполагаю, что обработка столбцов с AWK не проблема для вас, я просто сделать пример с датой части:

Assumen вы каким-то образом сделал строку: "2016-02-01 13:52 UTC"

echo "2016-02-01 13:52 UTC"|awk -v q='"' 
     '{cmd="TZ=Europe/Berlin date -d"q$0 q" +"q"%F %H.%M.%S %Z"q; 
     cmd|getline x; 
     close(cmd);print x}' 

Это даст :

2016-02-01 14.52.00 CET 

Таким образом, часовой пояс был преобразован. Обратите внимание, что важно, чтобы close(cmd) после линии прямой линии.

+1

Если/когда 'cmd | getline' терпит неудачу, что (возможно, без предупреждения) выводит предыдущее значение 'x'. Вам нужно что-то вроде 'if ((cmd | getline x) <= 0) x =" N/A "'. См. Http://awk.info/?tip/getline. –

+0

Обратите внимание, что опция '-d' для' date' предназначена для версии GNU в частности (coreutils). Команда 'date' в BSD, Solaris и т. Д. Функционирует по-разному. Это похоже на Linux-ориентированный ответ на неопределенный OS-вопрос. – ghoti

+1

@EdMorton thx. Продолжайте учиться у. – Kent

1

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

$ echo 1,2016-02-01,13:52,name1,... | 
    awk -F, '{cmd = "date -d \"" $2 " " $3 "\" \"+%F %H.%M.%S %Z\""; cmd | getline d; print d}' 

2016-02-01 13.52.00 EST 
+0

wait, этот результат правильный? '13:52 UTC' должно быть немецкое время' 14: 52' справа? он не делает преобразования, не так ли? – Kent

+0

Можете ли вы объяснить мне двойные кавычки, окружающие переменные $ 2 и $ 3? – menorah84

+0

они фактически находятся за пределами двойных кавычек, они объединяют командную строку даты из строк и переменных. см. так «xxx» ++ $ 2 ++ »« ++ $ 3 ++ «xxx». Однако я не включил TZ, который может быть вашим вопросом. – karakfa

Смежные вопросы