Marcação de “primeira entrada correspondente em cada dia” a partir de uma lista de registros, usando ferramentas padrão * nix

0

Eu tenho um arquivo de texto que contém registros do formulário:

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

Existem cerca de 20 conjuntos de dados, e registros para cada um são adicionados a uma taxa de um registro a cada 15 minutos quando as coisas estão funcionando normalmente, mas pode haver períodos em que os registros não são recebidos ou registros são adicionados em uma taxa mais rápida .

Os registros têm um conjunto de caracteres limitados de [0-9a-zA-Z -._ @] mais os caracteres especiais < > [] como delimitadores, como nas linhas de exemplo.

Para manter o número de registros baixos, os registros são marcados após algum tempo como "secundários" - não muito importantes / podem ser ignorados - adicionando um "*" no final da linha. O algoritmo que estou usando é passar o arquivo através de sed e usar regex find / replace para temporariamente marcar as linhas com base em se há alguma base para mantê-las, então canalize isso por sed novamente para remover as tags temporárias e qualquer linhas sem uma tag temporária agora estão marcadas como secundárias. Isso dá um gostinho de como eu estou fazendo isso (deixei de lado as continuações '\' para maior clareza):

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

Explicação do código CLI:

  1. Encontre todas as linhas com uma data nos últimos 2 dias e adicione um marcador temporário ("+"), ...
  2. Localiza todas as linhas com o tempo dentro de 1 minuto da meia-noite (geralmente o primeiro registro do dia para cada conjunto de dados) e adiciona um marcador temporário, ...
  3. Qualquer coisa não temporariamente marcada é considerada um registro secundário e recebe um *, ...
  4. Finalmente, todas as marcações temporárias são removidas.

É bruto, mas funciona bem e é flexível.

Meu problema é que quero manter "o primeiro registro de todos os dias para cada conjunto de dados". No momento, estou usando "dentro de um minuto da meia-noite" como forma de aproximar isso e confiar nos registros únicos do conjunto de dados naquele minuto. Ele funciona 100% se tudo correr bem, mas se houve um período excepcional em que o tempo normal de gravação foi interrompido, não funcionará. Por exemplo, se os registros estivessem todos atrasados em 1 minuto em algum período de tempo, pareceria que não há "registros importantes" nesse período, porque não é possível descobrir que o registro datado de 2018.02.20-00.01.27 é realmente o primeiro registro do dia para esse conjunto de dados, porque estou "estupidamente" verificando registros contendo 20NN.NN.NN-00.00.NN> apenas.

Estou familiarizado com sed , menos familiarizado com awk , que eu suspeito que possa ser a ferramenta de que preciso.

Como faço para tornar isso mais inteligente, para que ele possa determinar o primeiro registro real de cada dia, ou o primeiro registro após o dia 15 do mês, ou o que for, para garantir que os registros importantes não sejam vistos? por ser marcado como secundário.

    
por Stilez 02.03.2018 / 18:23

0 respostas