Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Как вычитать время из времени?  (Прочитано 787 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн wow_pi

  • Автор темы
  • Участник
  • *
  • Сообщений: 151
    • Просмотр профиля
Как вычитать время из времени?
« : 11 Январь 2017, 10:09:44 »
Есть файл, типа:
N Дата и время M1 M2 M3
1 25.10.2016 13:50:25 12,6 13,96 13,14
2 25.10.2016 13:51:26 12,6 13,78 13,24
3 25.10.2016 13:52:24 12,6 13,78 13,14
4 25.10.2016 13:53:26 12,52 13,78 13,24
5 25.10.2016 13:54:26 12,52 13,86 13,24
6 25.10.2016 13:55:26 12,52 13,86 13,24
7 25.10.2016 13:57:26 12,6 13,78 13,24
8 25.10.2016 13:58:26 12,6 13,86 13,24
...
И записан он прибором, который время от времени пропускает запись (см. строки 6 и 7).
Обнаружить пропуск средствами LO Calc достаточно просто. А можно ли обнаружить его средствами awk, или другой командой "терминала"?

Оффлайн Ampermetr

  • Активист
  • *
  • Сообщений: 491
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #1 : 11 Январь 2017, 10:51:08 »
можно как то так)
Код: Python
  1. #!/usr/bin/python
  2. with open ("/home/user/2.txt") as file:
  3.     f = file.readlines()
  4. for i in range(1,len(f)-1):
  5.     if int(f[i][19]) + 1 != int(f[i+1][19]):
  6.         if int(f[i][19]) != 9:
  7.             print ("Error in lines", i, " and ", i+1)
  8.         else:
  9.             if int(f[i+1][19]) != 0:
  10.                 print ("Error in lines", i, " and ", i+1)
« Последнее редактирование: 11 Январь 2017, 11:44:00 от Azure »
Женский форум,топик "Плакала всю ночь, подскажите из-за чего?"
Линукс форум, топик "Всю ночь собирал генту, подскажите зачем?"

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #2 : 11 Январь 2017, 11:37:47 »
Код: Bash
  1. awk -F'\t' '
  2.    {
  3.        #перевод строки в нормальный формат времени
  4.        split($2, t, "[.: ]")
  5.        ts = mktime(t[3] FS t[2] FS t[1] FS t[4] FS t[5] FS t[6])
  6.    }
  7.    ts - last > 70 && NR != 2 {
  8.        #вывод номера строки где интервал больше заданного (70 секунд)
  9.        print "Deviation in line", $1
  10.    }
  11.    {
  12.        #сохранение времени для следующей итерации
  13.        last = ts
  14.    }
  15.    ' файл
« Последнее редактирование: 11 Январь 2017, 11:53:08 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12073
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #3 : 11 Январь 2017, 13:12:38 »
Ampermetr, питоном файлы лучше обрабатывать интерактивно, а то вдруг там файл 50гигов, а вы его в память засосать целиком пытаетесь перед обработкой.

Кроме того с временем лучше работать стандартными утилитами.

Это классические ошибки новичков в программировании. Старайтесь от таких детских болезней избавляться сразу.

Решать такие задачи на питоне надо примерно так:

Код: Python
  1. #!/usr/bin/env python3
  2. from time import mktime, strptime
  3.  
  4. last = 0
  5. with open ("file.txt", 'rt') as f:
  6.   f.readline()  # skip first line
  7.   for line in f:
  8.     l = line.split()
  9.     t = mktime(strptime(l[1]+l[2], '%d.%m.%Y%H:%M:%S'))
  10.     if last and t-last > 70:
  11.       print('missed row before row# %s'%l[0])
  12.     last = t
  13.  
в примере я взял 70 секунд как недопустимое время между отсчетами.
« Последнее редактирование: 11 Январь 2017, 14:23:00 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн wow_pi

  • Автор темы
  • Участник
  • *
  • Сообщений: 151
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #4 : 12 Январь 2017, 01:15:58 »
Azure, огромное спасибо. Мне бы недели три, а то и четыре, до этого идти.
moy@moy-GA:~/lvn_doc/stat$ awk -F'\t' '
>     {
>         #перевод строки в нормальный формат времени
>         split($2, t, "[.: ]")
>         ts = mktime(t[3] FS t[2] FS t[1] FS t[4] FS t[5] FS t[6])
>     }
>     ts - last > 70 && NR != 2 {
>         #вывод номера строки где интервал больше заданного (70 секунд)
>         print "BINGO: Deviation in line", $1
>     }
>     {
>         #сохранение времени для следующей итерации
>         last = ts
>     }
>     ' 1.txt
BINGO: Deviation in line 7
BINGO: Deviation in line 77
BINGO: Deviation in line 777

Sly_tom_cat, большое спасибо. Python - это круто. Но, боюсь, до меня такие вещи станут доходить не раньше следующего года. Если повезет.
moy@moy-GA:~/lvn_doc/stat$ python3 obr_py2
BINGO: missed row before row# 7
BINGO: missed row before row# 77
BINGO: missed row before row# 777

Ampermetr, что-то не завелось.
moy@moy-GA:~/lvn_doc/stat$ python obr_py1
...
Traceback (most recent call last):
  File "obr_py1", line 5, in <module>
    if int(f[i][19]) + 1 != int(f[i+1][19]):
ValueError: invalid literal for int() with base 10: ':'
Но все равно спасибо вам за внимание к.

а то вдруг там файл 50гигов
А это вопрос философский. Поскольку файлы традиционно обрабатывались OO/LO Calc (иногда в MS Excel) то никаких резонов наращивать их размер свыше 20 Мб не было. А теперь как бы появились :)

Оффлайн Ampermetr

  • Активист
  • *
  • Сообщений: 491
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #5 : 12 Январь 2017, 07:10:18 »
wow_pi, почему выдает ошибку затрудняюсь сказать, оно должно всего лишь неправильно работать потому что там логическая ошибка)) хотя возможно это взаимосвязано
Женский форум,топик "Плакала всю ночь, подскажите из-за чего?"
Линукс форум, топик "Всю ночь собирал генту, подскажите зачем?"

Оффлайн svtv1

  • Забанен
  • Старожил
  • *
  • Сообщений: 2652
  • Это Я
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #6 : 12 Январь 2017, 07:36:39 »
Вот может это, но только город другой (твой не Москва) и год не 2014 :)
(Нажмите, чтобы показать/скрыть)
"Если достаточно долго сидеть возле реки - мимо проплывет труп твоего врага"

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12073
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #7 : 12 Январь 2017, 10:19:54 »
svtv1, ты тему то почитал прежде чем написать в нее?  :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #8 : 12 Январь 2017, 10:42:11 »
wow_pi, + Скрипт awk (точно так же как и других редакторов) можно сохранить в файле и при правильном she-bang вызывать как bash-скрипт.
Код: Bash
  1. #!/usr/bin/awk -f
  2.      BEGIN{
  3.          FS = "\t"
  4.       }
  5.      {
  6.          #перевод строки в нормальный формат времени
  7.          split($2, t, "[.: ]")
Тогда вызов
Код: Bash
  1. ./my_script.awk 1.txt
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн svtv1

  • Забанен
  • Старожил
  • *
  • Сообщений: 2652
  • Это Я
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #9 : 12 Январь 2017, 11:17:27 »
Sly_tom_cat,
внимательно прочитал, ах ну что, не до понял, ах ух о я идиоткаа, опоздала!!!!!
 

Пользователь добавил сообщение 12 Январь 2017, 11:26:06:
Sly_tom_cat,
Да тему читала внимательно?
« Последнее редактирование: 12 Январь 2017, 11:26:06 от svtv1 »
"Если достаточно долго сидеть возле реки - мимо проплывет труп твоего врага"

Оффлайн wow_pi

  • Автор темы
  • Участник
  • *
  • Сообщений: 151
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #10 : 12 Январь 2017, 13:36:00 »
Скрипт awk (точно так же как и других редакторов)
Да, так тоже красиво работает.
moy@moy-GA:~/lvn_doc/stat$ awk -f obr_awk.awk 1.txt
BINGO: Deviation in line 7
BINGO: Deviation in line 77
BINGO: Deviation in line 777

Все же, я полагаю, что мне будет полезнее держать "коды" открытыми: чем больше я увижу незнакомых слов, тем больше у меня возникнет поводов узнать их смысл. Разумеется, с точки зрения подготовки профессионального программиста, такой подход чистой воды ересь, поскольку в какой-то момент бессистемно надерганных "знаний" вполне станет хватать для решения какой-то конкретной, как в моем случае, задачи, и это "вполне" может сыграть с человеком дурную шутку. "К добру ли, к худу ли" я не программист; думаю, меня такое вот положение вещей не испортит :)

 

Страница сгенерирована за 0.238 секунд. Запросов: 22.