2012-04-21 2 views
2

У меня есть данные в файле, как это ...Преобразовать формат даты в последней колонке с AWK или другой

405,,,405,15.4,0,04/21/12 14:13:29 
402,,,402,15.4,0,04/21/12 14:13:37 
404,,,404,15.5,0,2012/04/21 14:14:05 
404,,,404,15.4,0,2012/04/21 14:14:11 
403,,,403,15.4,0,2012/04/21 14:14:17 

Я хочу, чтобы преобразовать последнюю колонку на дату в YYYY/чч MM/DD: мм : ss format.

Некоторые из этих линий уже находятся в таком формате, поэтому их следует игнорировать.

Я попробовал следующую команду AWK, но он кажется медленным, а иногда выбрасывает ошибки

awk -F ',' '{ ("date -d \""$7"\" \"+%Y/%m/%d %T\"") | getline $7; print }' MyFile 

Это не должно быть сделано в AWK. У меня есть какая-либо утилита, доступная в стандартной командной строке Debian.

+1

В вашей дате: '04/21/12' ==' 2012-04- 21'. Это правильно? – kev

+0

Вы создаете новый процесс для каждой строки, поэтому он медленный. – C2H5OH

+0

@kev да это правильно. –

ответ

5

Я бы использовал sed для этого, а не awk. Что-то вроде этого:

sed '[email protected],\(..\)/\(..\)/\(..\) @,20\3/\1/\2 @' 

Старого ответа, прежде чем вопрос был отредактирован:

Вы можете использовать tr : / конвертировать колон в слеш, или, возможно, вы можете сделать AWK сделать замену непосредственно. Но почему вы считаете, что HH/MM/SS действительный формат вне меня.

+0

Отредактированный вопрос. hh: mm: ss я имел в виду. Это формат даты, перед которым нужно переместиться. –

+0

+1 очень простой. – kev

+0

@John Zwinck работает красиво, не могли бы вы объяснить, как команда sed перемещает дату вокруг? –

1

Так как вы отметили свой вопрос , я предполагаю, что у вас есть gawk, который имеет некоторые встроенные функции времени:

awk --re-interval -F, ' 
    $7 !~ /[[:digit:]]{4}\// { 
     split($7, a, "[/ :]"); 
     strftime("%Y/%m/%d %H:%M:%S", 
      mktime("20" a[3] " " a[1] " " a[2] " " a[4] " " a[5] " " a[6]))}' 
    } 
    { 
     print 
    }' 
Смежные вопросы