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:
É 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.
Tags command-line awk sed text-editing