Найкращий спосіб збільшення числа в одному рядку в Linux [закрито]


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 .. & amp; що ще не знаю

  2. vim

  3. мови сценаріїв bash або python`

Яким буде канонічний спосіб зробити це?


Що б вам не сподобалося :) Я б, наприклад, використав perl, тому що я його знайомий і має дуже потужний regexp
Dan

Відповіді:


0

Просто для уточнення:

vim є системною утилітою (текстовим редактором) на більшості систем * nix. awk, sed, і bash є мовами (або інструментами, залежно від контексту), які можна використовувати для аналізу та зміни тексту.

Що потрібно для збільшення часу, і як часто потрібно збільшувати його? Ті фактори, які інструменти ви хочете використовувати. У будь-якому випадку, це зусилля з декількох частин.

  1. Ви спочатку підбираєте часткові рядки в рядку. Можна використовувати awk, sedабо grep -e, з регулярним виразу, щоб витягти ці підрядки.

  2. Коли ви маєте ці значення, ви перетворите їх у цілі числа (або якщо ви використовуєте більш повну мову, як python, ви зможете передати їх у значення дати за допомогою бібліотеки). Щоб змінити ці значення, потрібно виконати потрібну математику (і перевірку, якщо можливо).

  3. Нарешті, ви додасте замінені значення в рядок і зберігаєте змінений файл.

Чесно кажучи, це виглядає так sql, отже, набагато простіше використовувати вбудовані інструменти на цій мові змінювати ці цінності.


1
Ви це скажете awk і sed знаходяться в зовсім іншій категорії від vim? Чи цитуєте ви якусь посилання, чи це тільки ваша думка? У будь-якому випадку, я не згоден; Я вважаю, що ви вказуєте на відмінність, яка не існує. awk і sed є корисними програмами; так і є vim. awk і sed володіють командними мовами; робити vim (а також bash; і, як правило, не розглядаються оболонки корисності програми, вони безумовно є програмами). awk і sed це програми, які можна використовувати, щоб & lt; strike & gt; parse & lt; / strike & gt; аналізувати та змінювати текст; так і є vim.
G-Man

Я цитую роки в галузі, використовуючи інструменти. vim це мова так само, як і Microsoft Word. Я не зацікавлений в аргументації семантики з вами. Я тільки пояснив, оскільки мова ОП, яка використовувалася для опису їх, запропонувала незнання, і я намагався визначити терміни для них.
cognoscente

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 & gt; 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 об'єктів, щоб виконати арифметику дати / часу, а потім повернути назад у потрібний формат виводу.


Можна отримати 99% права за допомогою регулярного виразу, але немає простого способу врахувати, що потрібно збільшувати день, місяць або рік (а це навіть не стосується високосних років) .
Lieven Keersmaekers

@Lieven_Keersmaekers: будує об'єкти дат часу з результатів матчу для того, щоб зробити цю математику належним чином розумним, але мій перший інстинкт з Perl полягає в тому, щоб зробити скрипт, використовуючи позначення вікна і більш детальний стиль, щоб зробити намір більш ясним. Як один лайнер, я вважаю, що найкраще знати ваші дані і визначити, які перетворення дадуть бажаний результат.
deaks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.