У меня есть текстовый файл, который содержит записи в форме:
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]{2}>/ 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-го числа месяца, или что-то еще, чтобы гарантировать, что важные записи не будут видны из-за того, что помечен как вторичный.