【问题标题】:Printing information according to value of variable in awk根据awk中变量的值打印信息
【发布时间】:2023-02-21 20:42:03
【问题描述】:

我有以下 awk 文件并希望能够打印一些细节 当verbiage的值为1时。我应该在哪里设置变量verbiage = 0。 正如我所做的还是在其他地方?

verbiage = 0

BEGIN { display = 0 }

$0 ~ beg_ere {
   title = gensub(beg_ere, "\\2", 1, $0)
   subtitle = gensub(beg_ere, "\\3", 1, $0)
   keywords = gensub(beg_ere, "\\4", 1, $0)

   nuk = split(ukeys, uaggr, ",")
   nkw = split(keywords, kaggr, ",")

   if ( verbiage ) {
      print "Title: " title
      print "Subtitle: " subtitle
      print "Keywords: " keywords
      print "uaggr: " praggr(uaggr)
      print "kaggr: " praggr(kaggr)
      print "nuk:" nuk
      print "nkw:" nkw
    }
 }

display { sub(pn_ere, "") ; print }

【问题讨论】:

    标签: awk


    【解决方案1】:

    如果你把它放在 awk 脚本中:

    verbiage = 0
    

    在任何大括号之外,然后 awk 会将其解释为就好像您已经写过:

    (verbiage = 0) { print }
    

    因此对于读取的每个输入行它会将verbiage设置为0然后测试该分配的结果,这也是0这意味着在条件上下文中false,如果那是true(即非零,它不是)然后它会打印当前输入行。所以,不,不要那样做。

    awk 中的所有标量变量都具有初始值 0-or-null,因此您不需要将其设置为 0,因为它已经是 0。您已经在多个答案中看到如何将 awk 变量设置为初始值,所以它是不清楚你为什么问这个问题。话虽如此,也许这样的事情就是你想要做的:

    BEGIN { verbiage = ( (verbiage == 0) && (verbiage == "") ? 0 : verbiage ) }
    

    如果一个变量既等于 0 又等于空字符串,那么它是未设置的,所以在这种情况下我们 [不必要地] 将它设置为 0,否则我们将它设置为它已经具有的任何值。

    如果您不想使用可以写成的三元表达式:

    BEGIN {
        if ( (verbiage == 0) && (verbiage == "") ) {
            verbiage = 0
        }
    }
    

    在任何一种情况下,当您使用 awk -f script.awk 解释脚本时,在上述代码运行后,verbiage 将被设置为值 0,而如果您将其作为 awk -v verbiage=1 -f script.awk 运行,则 verbiage 将具有值 @ 987654335@。

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多