【问题标题】:awk program check if there is '0' in each lineawk 程序检查每一行是否有'0'
【发布时间】:2019-07-18 05:55:24
【问题描述】:

示例输入:

a 54 65 43
b 45 12 98
c 99 0 12
d 3 23 0

示例输出: c,d

基本上我想检查每一行是否有零值,如果是,则打印索引(a,b,c,d)。

我的代码:

for(i=1;i<=NF;i++)if(i==0){print$1}我遇到语法错误

谢谢。

【问题讨论】:

    标签: arrays linux unix awk


    【解决方案1】:

    另一种方法

    $ awk '/\y0\y/{print $1}' file
    c
    d
    

    \y 是字边界运算符。可能只在gawk

    【讨论】:

      【解决方案2】:

      代码需要一组大括号。

      awk '{ for(i=1;i<=NF;i++)if($i==0) print $1}' filename
      

      print 不需要大括号,所以我把它们拿出来了。)

      如果第一个字段不包含数字,则可能从 2 开始循环。

      Awk 脚本的一般形式是一系列

      condition { action }
      

      pairs,后者需要大括号围绕它。在没有条件的情况下,将无条件地对每一行执行操作。

      【讨论】:

      • 我正在写一个.awk 文件,所以我没有在代码中包含大括号。
      • 你仍然需要它们。
      • 是的,这就是问题所在。我认为 for 循环是一个条件而不是命令,所以我没有在它周围加上大括号。谢谢!
      【解决方案3】:

      要使您的代码正常工作,您需要将其更改为:

      $ awk '{for(i=1;i<=NF;i++)if($i==0) print $1}' file
      c                                                      
      d        
      
      • 您需要将代码放在一个块中({} 对)。
      • 你必须在 if 条件中使用$i 而不是i$i 表示ith 列。
      • 虽然这里不需要,但最好在命令和参数之间加一个空格。 (print $1)

      而且最好稍微改进一下:

      awk '{for(i=1;i<=NF;i++)if($i==0) {print $1;next}}' file
      

      添加next 以避免print $1 在行中有多个0 时出现多次。

      鉴于列是用空格分隔的,您也可以这样做:

      awk '/( |^)0( |$)/{print $1}' file
      

      这个不需要 GNU awk。
      /( |^)0( |$)/RegEx,在命令中是 $0 ~ /( |^)0( |$)/ 的缩写。
      ^ 表示行首,$ 行尾在这里.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 2011-05-15
        • 1970-01-01
        • 2015-01-25
        相关资源
        最近更新 更多