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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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) [Выделить]
#!/usr/bin/python
with open ("/home/user/2.txt") as file:
    f = file.readlines()
for i in range(1,len(f)-1):
    if int(f[i][19]) + 1 != int(f[i+1][19]):
        if int(f[i][19]) != 9:
            print ("Error in lines", i, " and ", i+1)
        else:
            if int(f[i+1][19]) != 0:
                print ("Error in lines", i, " and ", i+1)
« Последнее редактирование: 11 Января 2017, 11:44:00 от Azure »
Женский форум,топик "Плакала всю ночь, подскажите из-за чего?"
Linux форум, топик "Всю ночь собирал генту, подскажите зачем?"

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как вычитать время из времени?
« Ответ #2 : 11 Января 2017, 11:37:47 »
Код: (bash) [Выделить]
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 "Deviation in line", $1
    }
    {
        #сохранение времени для следующей итерации
        last = ts
    }
    ' файл
« Последнее редактирование: 11 Января 2017, 11:53:08 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Sly_tom_cat

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

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

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

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

Код: (python) [Выделить]
#!/usr/bin/env python3
from time import mktime, strptime

last = 0
with open ("file.txt", 'rt') as f:
  f.readline()  # skip first line
  for line in f:
    l = line.split()
    t = mktime(strptime(l[1]+l[2], '%d.%m.%Y%H:%M:%S'))
    if last and t-last > 70:
      print('missed row before row# %s'%l[0])
    last = t
в примере я взял 70 секунд как недопустимое время между отсчетами.
« Последнее редактирование: 11 Января 2017, 14:23:00 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://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, почему выдает ошибку затрудняюсь сказать, оно должно всего лишь неправильно работать потому что там логическая ошибка)) хотя возможно это взаимосвязано
Женский форум,топик "Плакала всю ночь, подскажите из-за чего?"
Linux форум, топик "Всю ночь собирал генту, подскажите зачем?"

Оффлайн svtv1

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

Оффлайн Sly_tom_cat

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

Оффлайн Azure

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

Оффлайн 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.018 секунд. Запросов: 20.