为什么 awk for loop 在打印任何内容之前需要 ENTER 键?

Why awk for loop require ENTER key before printing anything?

计划:for_loop.awk

{
sum = 0
i = 1
for (i=1; i<=10; i++)
{
  sum += i;
}
printf "Sum for 1 to 10 numbers = %d \nGoodbuy!\n\n", sum
exit 1
}

如果我使用 awk -f for_loop.awk 执行上面的代码,它正在等待输入,然后如果我按 ENTER 键,那么它只会显示 printf 语句,否则它是等待我的回应。

这不会发生在 while/do while 循环中。在 for 循环中,只有它需要键盘输入 (ENTER),然后才显示输出。

谁能解释为什么会这样? (请原谅我任何拼写或语法错误)


编辑:

还有一个与上述问题相关的问题,即

如果我在该程序中删除 exit 1,它仍在等待我的输入(Enter 键),如果我这样做,它会在我按下(Enter 键)时多次打印相同的输出,或者直到Ctrl+D(退出)。

没有循环怎么是运行无限次?意味着如果它正在执行 exit 1 意味着它不在循环中但是它如何返回并执行相同的语句。

谢谢

您的 awk 程序包含单个操作,每行输入都会触发该操作。当您按下 ENTER 时,您会使用第一行(尽管是空的)输入触发该操作。您按预期打印从 1 到 10 的总和,然后 exit 语句退出程序而不尝试读取更多输入。

这回答了您的问题,但我怀疑您还有更多想要锻炼的想法。如果您愿意,请更新您的问题(或提出新问题),我们会尽力提供更多帮助!

编辑 正如评论中提到的,awk 的基本方面是每行输入的正常操作是 运行,而不必自己明确地进行循环。玩这个例子 and/or 花几分钟看在线教程来理解这个想法:

BEGIN { print "do this once before reading input" }

{ print "do this for each line of input (now processing '" [=10=] "')" }

END { print "do this once after reading all input" }

除非你 运行 你的代码在 BEGIN 块中,否则 awk 将等待输入:

示例:

这等待输入:

awk '{print "hello world!"}'

这不是:

awk 'BEGIN{print "hello world!"}'

所以要修复您的代码:

BEGIN{
    for (i=1; i<=10; i++)
    {
       sum += i;
    }
    printf "Sum for 1 to 10 numbers = %d \nGoodbye!\n\n", sum
    exit 0
}

您也可以 运行 没有任何输入文件的 awk。

如果您键入以下命令行:awk ‘program’

awk 将程序应用于标准输入,这通常意味着您在终端上键入的任何内容。这一直持续到您通过键入 Ctrl-d 指示文件结尾为止。 (在其他操作系统上,文件结束字符可能不同。例如,在 OS/2 上,它是 Ctrl-z)


(来源:GAWK:Arnold D. Robbins 的 Effective AWK Programming)