为什么 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)
计划: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)