2013-02-21 4 views
2

У меня есть строка даты в формате 2012-12-20T01: 16: 02.05 и я хочу, чтобы преобразовать в формат 2011-12-20-01.16.02.050000Как сохранить миллисекунду информации при использовании mktime в awk?

В настоящее время я делаю это следующим образом

format = "%F-%H.%M.%S.%N" 
split(stringinput,input,"T"); 
split(input[1],date,"-") 
split(input[2],time,":") 

return strftime(format,mktime(date[1] " " date[2] " " date[3] " " time[1] " " time[2] " " time[3] " " time[4])); 

Но я теряю информацию о микросекундах или информацию в миллисекундах. Как я могу это получить. Он возвращается 2011-12-20-01.16.02.% N

Также любые предложения, чтобы сделать синтаксический анализ более общим. В настоящее время он поддерживает только один формат.

Спасибо.

ответ

1

Вам нужно будет обрабатывать миллисекундовые данные отдельно. Кроме того, используйте gensub() для форматирования строковой информации. Бегите как:

awk -f script.awk 

Содержание script.awk:

BEGIN { 

    string = "2012-12-20T01:16:02.05" 

    groups = "^(....)-(..)-(..).(..):(..):(..).*" 
    format = "\\1 \\2 \\3 \\4 \\5 \\6" 

    datespec = gensub(groups, format, "", string) 
    timestamp = mktime(datespec) 


    newstring = strftime("%F-%H.%M.%S", timestamp) 

    sub(/.*\./,"",string) 

    printf "%s.%s0000\n", newstring, string 
} 

Результаты:

2012-12-20-01.16.02.050000 

EDIT:

BEGIN { 

    string = "2011-01-10T14:45:13.815-05:00" 

    groups = "^(....)-(..)-(..).(..):(..):(..).*" 
    format = "\\1 \\2 \\3 \\4 \\5 \\6" 

    datespec = gensub(groups, format, "", string) 
    timestamp = mktime(datespec) 


    sub(/.*\./,"",string) 

    offset = substr(string,4) 

    split(offset,array,":") 

    seconds = (array[1] * 60 * 60) + (array[2] * 60) 

    newstring = strftime("%F-%H.%M.%S", timestamp - seconds, 1) 

    printf "%s.%s00\n", newstring, substr(string,0,3) 
} 

Результаты:

2011-01-10-09.45.13.81500 
+0

Привет, Стив, Спасибо, что работает. Но сможете ли вы предложить мне, как я могу сделать его общим для обработки ввода в любом формате. –

+0

@PriyaRanjan: В формате _any_? Это будет сложно. Вероятно, вы могли бы проверить пару различных регулярных выражений, используя цикл. Затем 'break' цикл, если' mktime() 'не возвращает' -1'. Если вы перечислите несколько разных форматов datetime, возможно, я смогу показать вам, как именно. – Steve

+0

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

1

Почему вы используете указываете ей()? Изменение вы охарактеризовали просто изменить текст:

$ echo "2012-12-20T01:16:02.05" | awk '{sub(/T/,"-"); gsub(/:/,"."); print $0 "0000"}' 
2012-12-20-01.16.02.050000 

Я предполагаю, что это просто опечатка, когда вы изменили 2012 по 2011 год в вашей продукции.

+0

+1 для предложения использования более простого подхода. –

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

  • Нет связанных вопросов^_^