2

У меня есть файл с форматом

47 2013-05-01 1367406011 2 30 15
47 2013-05-01 1367406388 1 29 14
43 2013-05-01 1367407469 1 26 12
42 2013-05-01 1367407489 1 25 11
42 2013-05-01 1367407810 1 24 11
39 2013-05-01 1367409056 1 22 9
41 2013-05-01 1367409610 1 22 9
36 2013-05-01 1367411409 1 22 9
34 2013-05-01 1367412388 1 20 9
32 2013-05-01 1367413208 1 19 9

Где третий столбец - это время измерения в секундах с начала эпохи. Мне бы хотелось, чтобы время каждый день было больше, и я ищу самый простой способ преобразования каждого столбца в файле.

Какой самый эффективный способ выполнить преобразование? (Я на OSX)

2 ответа2

3

В Vim этот быстрый макрос делает свою работу:

qq                           " start recording
0                            " go to first column
2W                           " go to time column
"mciw                        " put time in register m and replace it…
<C-r>=strftime("%T", @m)<CR> " …with localized time
<Esc>                        " exit insert mode
q                            " stop recording

Как только макрос записан, выберите все строки, которые вы хотите перевести, затем выполните:

:'<,'>norm @q

Если эти строки чередуются с другими строками, к которым вы не хотите прикасаться, вы можете использовать команду :g[lobal] чтобы выполнить макрос только в строках, которые соответствуют некоторому шаблону:

:g/2013-05/norm @q

Ссылка:

:h :normal
:h :global

а также

:h strftime()

для форматирования даты идеи.

С этим макросом ваш образец мгновенно становится:

47 2013-05-01 13:00:11 2 30 15
47 2013-05-01 13:06:28 1 29 14
43 2013-05-01 13:24:29 1 26 12
42 2013-05-01 13:24:49 1 25 11
42 2013-05-01 13:30:10 1 24 11
39 2013-05-01 13:50:56 1 22 9
41 2013-05-01 14:00:10 1 22 9
36 2013-05-01 14:30:09 1 22 9
34 2013-05-01 14:46:28 1 20 9
32 2013-05-01 15:00:08 1 19 9
2

Если у вас установлен Perl на компьютере, на котором вы это делаете, и если каждая строка в файле отформатирована идентично примеру в вашем вопросе, то следующая командная строка выдаст версию файла с временами Unix, замененными на человека -читаемые значения:

cat source-file | perl -pe's@(^\d+ [\d-]+ )(\d+)@$1 . scalar(localtime($2))@e;'

Я сам пользователь Emacs, но я понял из руководства vim, что вы можете применить эту команду к содержимому вашего текущего буфера, выполнив:

1,$!perl -pe's@(^\d+ [\d-]+ )(\d+)@$1 . scalar(localtime($2))@e;'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .