AWK for循环永远没有BEGIN

时间:2020-04-26 20:40:51

标签: awk

根据条件打印数字后,AWK中没有BEGIN for循环将永远消失-

使用BEGIN,我的值为5时,循环结束

$ awk 'awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
1
2
3
4
5

没有开始-

$ awk '{ for (i = 1; i <= 5; ++i) print i }'
 -> Press enter here for output
1
2
3
4
5
-> Press enter again and printed numbers again .
1
2
3
4
5

1
2
3
4
5
^C -> control C to come out of loop

虽然我知道BEGIN块将在程序开始时执行一次,但没有开始,但一旦满足退出条件,命令不应该退出吗?

请帮助了解此处发生的情况。

谢谢!

2 个答案:

答案 0 :(得分:1)

该循环确实退出,但是该循环在每个输入行执行一次,直到到达输入结尾。输入输入以提供EOF指示时,请尝试键入control-D而不是control-C。将 4:10 PM Gradle sync failed: The specified Gradle distribution 'https://services.gradle.org/distributions/gradle-5.6.5-all.zip' does not exist. Consult IDE log for more details (Help | Show Log) (2 s 225 ms) 更改为KeyedStream<Tuple2<String, Long>, Tuple> stream1 = stream.keyBy(0); stream1.print(); //Here I have results DataStream<Tuple3<Integer, String, Date>> stream2 = stream1.window(TumblingEventTimeWindows.of(Time.seconds(15))).apply(new WindowFunction<Tuple2<String, Long>, Tuple3<Integer, String, Date>, Tuple, TimeWindow>() { @Override public void apply(Tuple tuple, TimeWindow window, Iterable<Tuple2<String, Long>> input, Collector<Tuple3<Integer, String, Date>> out) { int counter = 0; for (Tuple2<String, Long> ignored : input) { counter++; } out.collect(new Tuple3<>( counter, tuple.get(0), //I also manually extracted the key from the Tuple, but that did also not work new Date(window.getEnd()))); } }); stream2.print(); //here I do not have any resulat ,并在脚本中添加print i语句以查看发生了什么。

答案 1 :(得分:1)

您问错了问题。

预计您在第二实验中的行为。您没有在命令行上指定一个或多个文件名,因此awk会读取标准输入。它一次读取一行,直到到达文件末尾(就像从实际文件中读取时一样)。并且,它执行您为每一行指定的规则;空行无关紧要。然后:ctrl-C是一种不文明的方式,通过蛮力终止程序;正确的方法是发出ctrl-D,标记“文件”的结尾并允许awk正常终止。

请注意,您的问题是“退出循环”和“程序终止”之间的混淆。当满足退出条件时,循环结束,然后awk前进到输入中的下一行。一般来说,退出程序规则中的一部分循环与awk程序本身终止无关。

“意外”行为是在您的第一个实验中。同样,awk也从标准输入中读取数据。为什么它不等EOF(ctrl-D)才退出,甚至认为BEGIN规则当然只会执行一次?

答案是“因为这是指定的行为”。例如:https://www.gnu.org/software/gawk/manual/html_node/Using-BEGIN_002fEND.html

如果awk程序只有BEGIN条规则,没有其他规则,则 BEGIN规则运行后,程序退出。

您也可以阅读脚注:

awk的原始版本一直在阅读并忽略输入内容,直到 看到文件的结尾。

我会说“原始版本”正在做“正确的事情”,但是这可能会使太多的用户感到困惑,因此行为发生了变化。

至少,这是GNU的“指定行为”;我不知道POSIX标准怎么说。