根据条件打印数字后,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块将在程序开始时执行一次,但没有开始,但一旦满足退出条件,命令不应该退出吗?
请帮助了解此处发生的情况。
谢谢!
答案 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标准怎么说。