【问题标题】:Why awk for loop require ENTER key before printing anything?为什么 awk for loop 在打印任何内容之前需要 ENTER 键?
【发布时间】:2015-03-02 15:03:36
【问题描述】:

程序: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 Key),如果我这样做,它会在我按下(Enter Key)或直到Ctrl+D(退出)。

没有循环如何无限次运行?表示它是否正在执行exit 1 表示它已超出循环但它如何返回并执行相同的语句。

谢谢

【问题讨论】:

  • 您缺少 AWK 的一个基本方面:为每条记录运行正常操作。如果您不提供任何记录,AWK 将不会做任何事情。
  • 另一件事 Ctrl+D = EOF(文件结束)
  • 回声,райтфолд,以我的编辑为例。
  • @райтфолд 你能解释一下它是如何在没有任何循环的情况下无限次运行的吗
  • 有一个循环 - awks 隐式工作循环逐行(默认)读取您的输入,直到 EOF。获取 Arnold Robbins 的《Effective Awk Programming》一书。

标签: for-loop awk


【解决方案1】:

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

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

编辑 正如 cmets 中提到的,awk 的基本方面是对每一行输入运行正常的操作,而不必自己显式地执行循环。试一试这个例子和/或花几分钟看一个在线教程来了解这个想法:

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

{ print "do this for each line of input (now processing '" $0 "')" }

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

【讨论】:

    【解决方案2】:

    除非您在 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 'END{print "hello world!"}' 它只会在我执行 "hello world!" 时打印 "hello world!" b>Ctrl+D(退出程序) 否则还在等待......
    • 我的错,应该是BEGIN搞混了
    • 如果我进入 BEGIN 循环,它工作正常,但我认为 BEGIN 和 END 有不同的用途,主要是我在这两个循环之间编写我的代码,我坚持为什么它需要 enter key 以及它如何无限次运行无循环
    • BEGIN {} 在输入之前运行,END{} 在输入之后运行。如果你只有 BEGIN 它不会等待输入
    • @phani 使用BEGIN 块非常适合您正在做的事情。不要错过循环后的exit 语句。
    【解决方案3】:

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

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

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


    (来源:GAWK:Arnold D. Robbins 的有效 AWK 编程)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多