在我按下CTRL+;之前,awk代码无法自动结束;D

在我按下CTRL+;之前,awk代码无法自动结束;D,awk,Awk,我有一个简单的awk代码,如下所示: awk 'BEGIN {OFMT="%.0f"} {print 18.23}' awk 'BEGIN {OFMT="%.0f";print 18.23}' 但在我按下回车键后,什么也没有了。我再次按ENTER键,然后得到结果18,但它不会自动结束,直到我按CTRL+D 我将代码更改为如下所示: awk 'BEGIN {OFMT="%.0f"} {print 18.23}' awk 'BEGIN {OFMT="%.0f";print 18.23}' 那

我有一个简单的awk代码,如下所示:

awk 'BEGIN {OFMT="%.0f"} {print 18.23}'
awk 'BEGIN {OFMT="%.0f";print 18.23}'
但在我按下回车键后,什么也没有了。我再次按ENTER键,然后得到结果18,但它不会自动结束,直到我按CTRL+D

我将代码更改为如下所示:

awk 'BEGIN {OFMT="%.0f"} {print 18.23}'
awk 'BEGIN {OFMT="%.0f";print 18.23}'
那么它工作得很好


我不知道为什么会有这样的差异。我的理解是:{print 18.23}是一个动作,但是为什么在我移动到BEGIN部分后没有问题?

{print…}
在第一个
中,awk
脚本被称为主输入循环。在此块中编写的执行处理的操作假定有一行输入可用。由于没有指定文件,它将等待用户输入。要在第一次迭代时终止它,您必须手动调用
exit
。这就是为什么您可以在下面看到管道
awk
按预期工作:

echo "" | awk 'BEGIN {OFMT="%.0f"} {print 18.23;}'
awk
中有三个主要块:

  • 开始{}
    一次
  • 在每个输入行上执行
    {}
  • 在处理结束时结束{}
    一次
这张图片来自O'Reilly sed&awk书籍:


{print…}
在第一个
awk
脚本中被称为主输入循环。在此块中编写的执行处理的操作假定有一行输入可用。由于没有指定文件,它将等待用户输入。要在第一次迭代时终止它,您必须手动调用
exit
。这就是为什么您可以在下面看到管道
awk
按预期工作:

echo "" | awk 'BEGIN {OFMT="%.0f"} {print 18.23;}'
awk
中有三个主要块:

  • 开始{}
    一次
  • 在每个输入行上执行
    {}
  • 在处理结束时结束{}
    一次
这张图片来自O'Reilly sed&awk书籍:


您的操作将在每一行输入上执行。您的操作将在每一行输入上执行。谢谢,现在我明白了,在第一个awk脚本中打印将假定循环不止一次(等待手动输入),如果没有指定文件,谢谢,现在我明白了,在第一个awk脚本中打印将假定循环不止一次(等待手动输入),如果没有指定文件,