Пометка «первой соответствующей записи в каждый день» из списка записей с использованием стандартных инструментов * nix

226
Stilez

У меня есть текстовый файл, который содержит записи в форме:

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:

  1. Найдите каждую строку с датой за последние 2 дня и добавьте временный маркер ("+"), ...
  2. Находит каждую строку со временем в течение 1 минуты от полуночи (обычно это первая запись дня для каждого набора данных) и добавляет временный маркер, ...
  3. Все, что временно не помечено, считается вторичной записью и получает *, ...
  4. В конце концов все временные отметки удаляются.

Это сырой, но работает хорошо, и является гибким.

Моя проблема в том, что я хочу вести «первую запись каждого дня для каждого набора данных». Прямо сейчас я использую «в течение минуты полуночи» как способ приблизиться к этому, и полагаюсь на уникальные записи набора данных в эту минуту. Он работает на 100%, если все идет гладко, но если был исключительный период, когда было нарушено обычное время записи, он не будет работать. Например, если все записи были задержаны на 1 минуту в некотором периоде времени, то выглядело бы так, как будто у нас нет «важных записей» в этот период, потому что невозможно определить, что запись от 2018.02.20-00.01.27 на самом деле первая запись дня для этого набора данных, потому что я «тупо» проверяю записи, содержащие20NN.NN.NN-00.00.NN> только .

Я знаком с sed, менее знаком сawk который, как я подозреваю, может быть тем инструментом, который мне нужен.

Как мне сделать это более разумным, чтобы он мог определять фактическую первую запись каждого дня или первую запись после 15-го числа месяца, или что-то еще, чтобы гарантировать, что важные записи не будут видны из-за того, что помечен как вторичный.

0
Если я правильно понял, я думаю, что это может помочь. Я следовал вашему `Объяснению кода CLI`, чтобы выполнить условия. awk BEGIN ; ; gsub (/\./, "", line_date [1]); gsub (/\./, "", line_date [2]); if (mktime (line_date [1] "" line_date [2])> two_days_ago) ; к югу (/ $ /, "*"); print} 'input-file` Paulo 6 лет назад 0

0 ответов на вопрос

Похожие вопросы