【问题标题】:How to suppress awk output when using FS?使用FS时如何抑制awk输出?
【发布时间】:2014-06-02 04:39:42
【问题描述】:

在使用通过命令行传递的字段分隔符和在脚本中使用 FS=":" 时,我无法理解 awk 的行为差异。

我认为使用-F 提供字段分隔符和在awk 中使用FS 变量是一回事。

但如果我这样做:

awk -F: '{}' /etc/passwd

由于空操作 ({}),它不会按预期打印任何内容。 而且,如果我写一个脚本:

#!/usr/bin/awk -f
{}

没有任何行被打印到输出中,正如预期的那样。

现在,如果我将字段分隔符放在脚本中,如下所示:

#!/usr/bin/awk -f

FS=":";
{}

它再次打印所有行!

所以,我想禁止脚本中的默认打印操作,因为我将在该操作中进行一些计算并稍后在END 部分中打印结果。如果不先 awk 打印所有行,我该怎么做?

【问题讨论】:

    标签: bash awk


    【解决方案1】:
    FS=":";
    

    这条线并不像你想象的那样。这不是一个指令。 awk 不像大多数解释语言那样工作:文件不是指令列表。在顶层,您有<em>CONDITION</em> <em>ACTION</em> 形式的项目,其中条件是表达式,动作是包含语句(指令)的大括号分隔块。对满足条件的每条记录(行)执行操作。条件和动作都是可选的。

    赋值是表达式,所以FS=":"是表达式,没有对应的动作。省略该操作时,默认为“打印当前记录”。至于下一行的{},它是一个什么都不做的动作,没有条件(意思是“总是”);什么都不写也有同样的效果。

    要在脚本启动时执行代码,您需要一个 BEGIN 块。您可以将BEGIN 视为一个特殊条件,在读取任何输入之前,它在脚本开头匹配一次。

    BEGIN {FS = ":"}
    

    【讨论】:

      【解决方案2】:
      > /foo/  { }  # match foo, do nothing - empty action
      > 
      > /foo/       # match foo, print the record - omitted action
      

      here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2014-10-17
        • 2018-08-14
        • 2013-10-14
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多