2016-12-29 4 views
0

У меня есть огромное количество файлов, где каждая строка является json с неправильным форматом даты. Формат, который у меня есть сейчас: 2011-06-02 21:43:59, и мне нужно добавить T, чтобы преобразовать его в формат ISO 2011-06-02T21:43:59.awk change datetime format

Может кто-нибудь, пожалуйста, указать мне на какое-то одно решение для лайнера? Борясь с этим в течение 2 часов, но не повезло.

+3

показать образец, 5 или 10 элементов в файле должно быть достаточно , – Lizardx

+1

показать нам образец файла! – NinjaGaiden

+1

Неясно, что подразумевается под _ «количеством файлов, где каждая строка является json» _. Вы имеете в виду, что каждый файл содержит несколько объектов JSON? –

ответ

0

Ниже, как представляется, рабочий раствор:

sed -i -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})/\1T\2/g' myfiles

  • -i обрабатывать файлы
  • -r является переключение на расширенное регулярное выражение
  • ([0-9]{4}-[0-9]{2}-[0-9]{2}) - для даты
  • - пространство между датой и временем в Исходные данные
  • ([0-9]{2}:[0-9]{2}:[0-9]{2}) - для времени
1

sed придет к вам на помощь, с помощью простого regex:

sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' file > file.new 

или изменить файл в месте:

sed -i 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' file 

Пример

echo '2011-06-02 21:43:59' | sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' 
2011-06-02T21:43:59 

Читать подробнее о регулярных выражениях здесь: Regex Tag Info

+0

Это, кажется, не работает, пожалуйста, см. Мое решение. –

+0

@ mr.nothing: он работал для меня (попробовал это на Ubuntu 12.04). Какая ошибка вы получаете? В ответе я опубликовал пример. – codeforester

0

Также с awk, вы можете сопоставить группу с gensub:

awk '{ 
    print gensub(/([0-9]{4}-[0-9]{2}-[0-9]{2})\s+([0-9]{2}:[0-9]{2}:[0-9]{2})/, 
     "\\1T\\2", 
     "g"); 
}' data.txt 
0
echo '2011-06-02 21:43:59' | awk 'sub(/ /,"T")' 
2011-06-02T21:43:59