A sua ilustração parece não corresponder às suas palavras.
Se você quer dizer o que você diz (e se eu estou entendendo suas palavras corretamente),
e supondo que você tenha uma lista de valores "Y"
(isto é, o número de horas, variando entre 0 e 2400)
que você deseja normalizar, você pode fazer o que quiser com esse código awk
:
awk '
NR==1 { prev_good = $1 }
{
data = $1
if (data < prev_good) {
count++
next
}
if (count > 0) {
count++
for (i = 1; i < count; i++) {
print prev_good + (data-prev_good) * i / count
}
count = 0
}
print data
prev_good = data
}'
Ele assume que o primeiro ponto de dados é válido ( NR==1 { prev_good = $1 }
).
Depois disso,
se um ponto de dados for menor que o valor bom anterior ( prev_good
,
qual é o maior valor visto até agora), trate-o como inválido:
pule-o ( next
) e conte os pontos que você pulou.
Quando tiver um bom valor, teste count
- se for positivo,
isso significa que pulamos alguns dados, então geramos muitos valores de dados,
interpolando linearmente entre o último valor bom e o valor atual.
Em seguida, imprima o novo valor válido.
Se a sua entrada contiver "X" e "Y" (data e hora), isso se torna um pouco mais complicado especialmente se os intervalos "X" não forem uniformes.
Você poderia fazer isso como um script de shell puro, mas isso seria bobo.
awk
, no entanto, parece ser uma boa ferramenta para o trabalho.