Processamento contínuo da saída da cauda [f]

3

Eu tenho um arquivo em que os números são adicionados continuamente:

1
2
3
4

Eu quero calcular a média deles, também continuamente, ou seja:

1
1.5
2
2,5

Eu não quero verificar o arquivo periodicamente, quero fazê-lo na maneira como funciona a cauda - assim que uma linha é anexada, eu faço cálculos médios.

É possível?

UPD Pergunta movida para link

    
por Stas 22.02.2012 / 17:45

2 respostas

1

Sim. Pipe tail -f para um script que manipula sua média. O pipe nunca fecha e o script pode ser processado instantaneamente para cada linha que recebe ... ele irá bloquear até aparecer uma linha.

Além disso, deve-se ter em mente que é possível calcular uma média em execução sem precisar adicionar todos os valores a cada vez. Eu já vi isso o suficiente, sinto a necessidade de mencionar isso.

#generator.pl
$| = 1; #immediate flush
while (1) {
    print int rand(100), "\n";
    sleep 1;
}
#average.pl
$| = 1; #immediate output flush
my $average = 0;
my $count = 0;
while (<>) {
    $average = ($average * $count + $_) / ($count + 1);
    $count++;
    print $average, "\n";
}
$ perl generator.pl > source &
[2] 15564
(reverse-i-search)'': ^C
$ tail -f source | perl average.pl
54
28
27.6666666666667
35
41

E apenas para sorrisos:

$tail -f source | awk '{total+=$0; count+=1; print total/count}'

Isso também tem feedback instantâneo. Parece-me que o seu problema está sendo armazenado em buffer pelo aplicativo que está gravando no arquivo que a cauda está lendo.

Veja link para informações sobre isso.

    
por 22.02.2012 / 18:06
2

Aqui está uma solução simples usando dc.

tail -f | dc -e '5k 0 d sc st [? lc 1 + sc lt + st lt lc / p c lax] sa lax'

Não tenho certeza se dc suporta recursão de cauda, se não este programa irá vazar memória. DC tem documentação muito ruim. :)

Você não gosta de brainfuck? :)

Aqui está uma solução fácil em Ruby. tail -f | ruby -e 'sum=total=0.0; while line=gets; total += line.to_f; sum += 1; puts total/sum; end'

    
por 22.02.2012 / 18:30

Tags