我可以在awk中执行基于时间的进度吗?

我可以在awk中执行基于时间的进度吗?,awk,Awk,我目前正在使用awk脚本对控制台输出进行审查,每审查一行打印一个点 我想更新这段代码,以避免每分钟打印超过一个点(或类似的东西)。显然,如果我没有取得任何进展(流式传输新线路),就不应该进行更新 代码的当前版本位于 注:我知道我可以打印带有“mod 10”或类似内容的换行符以限制输出,但这种方法并不好,因为接收行的速度不一致,有时我会收到很多行,有时我只收到一到两行。因此,我需要使用一种基于计时器的方法,这种方法类似于“如果最后一行打印时间超过x秒,则打印换行符”使用GNU awk for ti

我目前正在使用
awk
脚本对控制台输出进行审查,每审查一行打印一个点

我想更新这段代码,以避免每分钟打印超过一个点(或类似的东西)。显然,如果我没有取得任何进展(流式传输新线路),就不应该进行更新

代码的当前版本位于


注:我知道我可以打印带有“mod 10”或类似内容的换行符以限制输出,但这种方法并不好,因为接收行的速度不一致,有时我会收到很多行,有时我只收到一到两行。因此,我需要使用一种基于计时器的方法,这种方法类似于“如果最后一行打印时间超过x秒,则打印换行符”

使用GNU awk for time(时间)功能,您只需将当前输入行处理的时间与上一个点打印的时间(以秒为单位)进行比较,即可打印点的频率不超过每分钟一次:

awk '
function prtDot() {
    currTime = systime()
    if ( (currTime - prevTime) > 60 ) {
        printf "." | "cat>&2"
        prevTime = currTime
    }
}
{ print $0; prtDot() }
END { print "" | "cat>&2" }
'
e、 g.在数字流中每隔10秒打印一个

$ cat tst.awk
function prtDot() {
    currTime = systime()
    if ( (currTime - prevTime) > 10 ) {
        printf "." | "cat>&2"
        prevTime = currTime
    }
}
{ printf "%s",$0%10 | "cat>&2"; prtDot() }
END { print "" | "cat>&2" }

$ i=0; while (( i < 50 )); do echo $((++i)); sleep 1; done | awk -f tst.awk
1.2345678901.23456789012.3456789012.34567890123.4567890

$ i=0; while (( i < 50 )); do echo $((++i)); sleep 3; done | awk -f tst.awk
1.2345.6789.0123.4567.8901.2345.6789.0123.4567.8901.2345.6789.0
$cat tst.awk
函数prtDot(){
currTime=systime()
如果((当前时间-当前时间)>10){
printf“|”类别>&2”
prevTime=currTime
}
}
{printf“%s”,$0%10 |“cat>&2”prtDot()}
结束{打印“”|“cat>&2”}
$i=0;而((i<50));do echo$(++i));睡眠1;完成| awk-f tst.awk
1.2345678901.23456789012.3456789012.34567890123.4567890
$i=0;而((i<50));do echo$(++i));睡眠3;完成| awk-f tst.awk
1.2345.6789.0123.4567.8901.2345.6789.0123.4567.8901.2345.6789.0

打印的实际数字与预期数字之间的微小差异是由于while循环的其他部分增加了回声和其他小的不精确之间的总间隔,影响shell循环打印数字的时间,从而影响
systime()的时间
在awk中被调用。

使用GNU awk的时间函数,只需将当前输入行正在处理的历元后的时间与上一个点打印的时间进行比较,即可不超过每分钟打印一次点:

awk '
function prtDot() {
    currTime = systime()
    if ( (currTime - prevTime) > 60 ) {
        printf "." | "cat>&2"
        prevTime = currTime
    }
}
{ print $0; prtDot() }
END { print "" | "cat>&2" }
'
e、 g.在数字流中每隔10秒打印一个

$ cat tst.awk
function prtDot() {
    currTime = systime()
    if ( (currTime - prevTime) > 10 ) {
        printf "." | "cat>&2"
        prevTime = currTime
    }
}
{ printf "%s",$0%10 | "cat>&2"; prtDot() }
END { print "" | "cat>&2" }

$ i=0; while (( i < 50 )); do echo $((++i)); sleep 1; done | awk -f tst.awk
1.2345678901.23456789012.3456789012.34567890123.4567890

$ i=0; while (( i < 50 )); do echo $((++i)); sleep 3; done | awk -f tst.awk
1.2345.6789.0123.4567.8901.2345.6789.0123.4567.8901.2345.6789.0
$cat tst.awk
函数prtDot(){
currTime=systime()
如果((当前时间-当前时间)>10){
printf“|”类别>&2”
prevTime=currTime
}
}
{printf“%s”,$0%10 |“cat>&2”prtDot()}
结束{打印“”|“cat>&2”}
$i=0;而((i<50));do echo$(++i));睡眠1;完成| awk-f tst.awk
1.2345678901.23456789012.3456789012.34567890123.4567890
$i=0;而((i<50));do echo$(++i));睡眠3;完成| awk-f tst.awk
1.2345.6789.0123.4567.8901.2345.6789.0123.4567.8901.2345.6789.0

实际打印的数字与预期数字之间的微小差异是由于while循环的其他部分增加了回声和其他小不精确之间的总间隔,影响shell循环打印数字以及因此在awk中调用
systime()
时。

谢谢!在MacOS上,我必须安装gawk。现在看来,我可以提供友好的进度线,谢谢!在MacOS上,我必须安装gawk。现在看来,我能够提供友好的进度线