1

У меня есть одна строка с большим количеством записей, среди которых также время.

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

Я хотел бы увеличить каждый раз на несколько часов. в 24-часовом формате. Например, 10:30:00 станет 15:30:00 .

Какой лучший универсальный инструмент для этой работы? Я думаю с точки зрения:

  1. системные утилиты, такие как awk , sed .. и что еще я не знаю

  2. vim

  3. скриптовые языки вроде bash или python`

Каков будет канонический способ сделать это?

2 ответа2

0

В этом ответе есть несколько полезных советов, предлагающих путь наименьшего сопротивления с использованием таких языков сценариев, как Perl, Python, Ruby и т.д., Которые позволяют смешивать математические операции и операции сопоставления.

Вот быстрый взлом с Perl:

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

В этом упрощенном примере класс цифровых символов (\d), за которым следует индикатор повторения (например, {2}), используется для захвата позиционных компонентов даты, и мы слепо выполняем арифметику в поле часа. Этот тип решения подходит только тогда, когда вы знаете свои данные достаточно хорошо, чтобы гарантировать, что упрощенная арифметика в поле часов не приведет к смещению дня.

Пересматривая эту проблему для решения правильной арифметики даты / времени, когда поле часов переполняется, как подсказывает @Lieven, можно использовать основной модуль Perl Time::Piece (Perl> 5.8):

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

Входные данные этого примера были обновлены, чтобы показать изящную обработку значений часов, перенесенных на следующий день. Он извлекает модуль Time::Piece из командной строки, сопоставляет дату и время с входных данных, преобразует их в объекты Time::Piece для выполнения арифметики даты / времени, а затем переводит обратно в желаемый формат вывода.

0

Просто для ясности:

vim - системная утилита (текстовый редактор) в большинстве систем * nix. awk , sed и bash - это языки (или инструменты, в зависимости от контекста), которые вы можете использовать для анализа и изменения текста.

Зачем вам нужно увеличивать время и как часто вам нужно его увеличивать? Те факторы в какие инструменты вы хотите использовать. В любом случае, это работа, состоящая из нескольких частей, при условии, что это не SQL:

  1. Сначала вы сопоставляете частичные строки внутри строки. Вы можете использовать awk , sed или grep -e с регулярным выражением, чтобы вытянуть эти подстроки.

  2. Когда у вас есть эти значения, вы преобразуете их в целые числа (или если вы используете более полный язык, такой как python, вы можете преобразовать их в значения даты и времени с помощью библиотеки). Вам нужно будет выполнить математику, необходимую вам (и проверку, если применимо), чтобы изменить эти значения.

  3. Наконец, вы добавите замененные значения в строку и сохраните измененный файл.

Честно говоря, хотя это выглядит как sql , так что может быть намного проще использовать встроенные в этот язык инструменты для изменения этих значений.

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