Пометка «первой соответствующей записи в каждый день» из списка записей с использованием стандартных инструментов * nix
У меня есть текстовый файл, который содержит записи в форме:
text text <2018.02.20-13.05.22> [dataset-london] text text text text text <2018.02.20-13.05.25> [dataset-newyork] text text text text text <2018.02.20-13.05.22> [dataset-moscow] text text text text text <2018.02.20-13.07.45> [dataset-london] text text text text text <2018.02.20-13.09.55> [dataset-paris] text text text
Существует около 20 наборов данных, и записи для каждого из них добавляются с частотой одна запись каждые 15 минут, когда дела идут гладко, но могут быть периоды, когда записи не принимаются или записи добавляются с большей скоростью.
Записи имеют ограниченный набор символов [0-9a-zA-Z -._ @] плюс специальные символы <> [] в качестве разделителей, как в строках примера.
Чтобы уменьшить количество записей, записи через некоторое время помечаются как «вторичные» - не очень важные / могут быть проигнорированы - добавлением «*» в конце строки. Алгоритм, который я использую, состоит в том, чтобы передать файл sed
и использовать регулярное выражение find / replace для временного тегирования строк, основываясь на том, есть ли основания для их сохранения, а затем передать это sed
снова, чтобы удалить временные теги, и любые строки без временного тега теперь помечен как вторичный. Это дает представление о том, как я это делаю (для ясности я пропустил продолжения '\'):
cat input_file | sed -E '/(`date '+%Y\.%m\.%d'`|`date -v-1d '+%Y\.%m\.%d'`)/ s/$/#/' | sed -E '/00\.00\.[0-9]>/ s/$/#/' | sed '/#$/! s/$/*/' | sed -E 's/#+$//' > output_file
Объяснение кода CLI:
- Найдите каждую строку с датой за последние 2 дня и добавьте временный маркер ("+"), ...
- Находит каждую строку со временем в течение 1 минуты от полуночи (обычно это первая запись дня для каждого набора данных) и добавляет временный маркер, ...
- Все, что временно не помечено, считается вторичной записью и получает *, ...
- В конце концов все временные отметки удаляются.
Это сырой, но работает хорошо, и является гибким.
Моя проблема в том, что я хочу вести «первую запись каждого дня для каждого набора данных». Прямо сейчас я использую «в течение минуты полуночи» как способ приблизиться к этому, и полагаюсь на уникальные записи набора данных в эту минуту. Он работает на 100%, если все идет гладко, но если был исключительный период, когда было нарушено обычное время записи, он не будет работать. Например, если все записи были задержаны на 1 минуту в некотором периоде времени, то выглядело бы так, как будто у нас нет «важных записей» в этот период, потому что невозможно определить, что запись от 2018.02.20-00.01.27 на самом деле первая запись дня для этого набора данных, потому что я «тупо» проверяю записи, содержащие20NN.NN.NN-00.00.NN>
только .
Я знаком с sed
, менее знаком сawk
который, как я подозреваю, может быть тем инструментом, который мне нужен.
Как мне сделать это более разумным, чтобы он мог определять фактическую первую запись каждого дня или первую запись после 15-го числа месяца, или что-то еще, чтобы гарантировать, что важные записи не будут видны из-за того, что помечен как вторичный.
0 ответов на вопрос
Похожие вопросы
-
2
.profile в Mac OS X?
-
13
Какие функции Vim вы используете?
-
6
Какие функции Zsh вы используете?
-
-
5
Прозрачная командная строка в Vista?
-
13
Лучший редактор LaTeX
-
4
Используйте портфель Windows из командной строки
-
4
Почему некоторые команды не существуют?
-
11
Есть ли простой способ разделить mp3 файлы?
-
2
Как я могу получить OSX Terminal.app для открытия полноэкранного режима, а не каскадного?
-
4
Синхронизация удаленных папок в Linux