【问题标题】:Why does "1" in awk print the current line?为什么 awk 中的“1”打印当前行?
【发布时间】:2013-12-14 07:10:40
【问题描述】:

this answer

awk '$2=="no"{$3="N/A"}1' file

被接受。请注意 AWK 脚本末尾的 1。在cmets中,答案的作者说

[1 是] 一种显示当前行的神秘方式。

我很困惑。它是如何工作的?

【问题讨论】:

  • 你可以看看这个页面:backreference.org/2010/02/10/idiomatic-awk
  • 我对这个问题投了反对票,因为这个问题被问了一遍又一遍。只需进行谷歌搜索或阅读有关awk的任何基本信息
  • [对很多人来说]stackoverflow 比冗长的文章和论坛讨论等更容易找到答案。因此,无论问题在其他地方多久得到回答,stackoverflow 帖子仍然可以增加价值。
  • 我对这个问题投了赞成票,因为谷歌就搬到这里了。

标签: awk


【解决方案1】:

我想我应该添加一个答案来解释这个速记是如何根据POSIX specification for awk 工作的:

基本说明

一个 awk 程序由以下形式的对组成:

pattern { action }

缺少动作

可以省略模式或动作(包括括号字符)。 缺失的模式应匹配任何输入记录,缺失的动作应等同于:

{ print }

模式说明

模式是任何有效的表达式

表达模式说明

一个表达式模式应该被评估为好像它是一个表达式 布尔上下文。如果结果为真,则该模式应被视为 匹配,并执行相关操作(如果有)。

布尔上下文

当在布尔上下文中使用表达式时,如果它有一个数值, 零值应视为假,任何其他值应视为 视为真实。否则,空字符串的字符串值应为 视为假,任何其他值应视为真。


awk '$2=="no"{$3="N/A"}1'的例子中,第一个pairpattern$2=="no",对应的action$3="N/A" .这使得1 本身成为下一个“对”(没有相应操作的模式)。

这个单独的表达式模式可以是任何数值或非空字符串,而不是1,例如,

awk 9999
awk '"string"'

awk 1 简写在交互式 shell 中键入单行时很好。另一方面,在编写脚本时,我更喜欢我的代码使用更明确的awk '{ print }',使其更易于维护和可读。

【讨论】:

    【解决方案2】:

    AWK 处理条件方法,然后是操作。因此,如果任何条件为 TRUE,那么我们提到的任何动作都会被执行。

    1 的情况下,这意味着我们正在使该条件为TRUE,在这种情况下,我们没有提及要发生的任何操作,因此默认情况下awk 的操作print 将发生。

    所以这就是为什么我们实际上用快捷方式写 1。

    【讨论】:

      【解决方案3】:

      文档says

      在 awk 规则中,可以省略模式或操作,但不能同时省略两者。如果省略该模式,则对每个输入行执行该操作。如果省略该操作,则默认操作是打印与模式匹配的所有行。

      因此,它将1 视为没有任何操作的模式。默认操作是打印该行。

      即使你有一些规则,比如在

      awk '
          in_net {
              if (/^\s+bindIp:/) {
                  print "  bindIp: 0.0.0.0"
                  next
              } else if (/^\s*(#.*)?$/) {
                  in_net = 0
              }
          }
          /^net:/ {
              in_net = 1
          }
          1
      ' /etc/mongod.conf
      

      您仍然需要1,因为只有在遇到没有操作的规则时才会触发默认操作。

      【讨论】:

        【解决方案4】:

        awk

        由于1 总是评估为true,它执行默认操作{print $0},因此打印存储在$0 中的当前行

        所以,awk '$2=="no"{$3="N/A"}1' file 等价于和简写

        awk '$2=="no"{$3="N/A"} {print $0}' file
        

        同样$0print的默认参数,所以你也可以写

        awk '$2=="no"{$3="N/A"} {print}' file
        

        事实上,您也可以使用任何非零数或任何总是评估为 true 的条件来代替 1

        【讨论】:

        • 您能否提供对文档的参考?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 2013-07-11
        • 2022-06-10
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多