持续处理tail -f输出

3

我有一个文件,其中数字不断被添加:

1
2
3
4

我想计算它们的平均值,而且是连续的,即:

1
1.5
2
2,5

我不想定期检查文件,我希望以tail -f的方式工作 - 只要有一行被追加,我就进行平均值计算。 是否可能? PS 尝试过tail -f file.txt | awk '{total+=$0;count+=1;print total/count}',但没有输出,卡住了。

你的规格说明有矛盾 - tail -f 通过定期检查文件来工作。 - Colin Macleod
2个回答

2

你可能会遇到缓冲问题。也许适合你的解决方案是:

perl -wne 'BEGIN{ $| = 1 } $t += $_; print $t / $. . "\n"; '

$| = 1 关闭缓冲,其余部分与您的 awk 脚本相同。


你认为为什么会出现缓冲问题? - Karoly Horvath
@yi_H "经常没有输出"通常表示缓冲问题,但是这个awk解决方案对我来说实际上非常有效。 - William Pursell
好的,缓冲问题确实是我面临的问题。我在 tail -f 之后使用了额外的 awk(需要一些修改),这导致了缓冲问题。实际上,tail -f 正确地刷新数据。但还是感谢你的帮助。最终我得到的是:tail -f source.txt | awk '{...; fflush()}' | awk '{total+=$0;count+=1; print total/count}'。 - glaz666

-1

Tcl非常适合这种事件驱动的编程。假设您的PATH中有tclsh

#!/usr/bin/env tclsh

proc calculate_running_mean {chan} {
    gets $chan line
    if {[string is integer -strict $line]} {
        incr ::sum $line
        incr ::count 1
        puts [expr {1.0 * $::sum / $::count}]
    }
}

set filename numbers.txt
set fid [open $filename r]
fileevent $fid readable [list calculate_running_mean $fid]
vwait forever

我认为如果您尝试像这样使用fileevnt,您会发现它将持续触发 - 它只适用于从通道(如套接字或串行端口)读取。 - Colin Macleod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接