awk程序检查每行中是否有“ 0”

时间:2019-02-24 19:50:56

标签: arrays linux unix awk

样本输入:

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}我遇到语法错误

谢谢。

3 个答案:

答案 0 :(得分:5)

另一种方法

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

\y是单词边界运算符。可能只在gawk中。

答案 1 :(得分:2)

代码需要大括号。

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

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

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

Awk脚本的一般形式是序列

condition { action }

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

答案 2 :(得分:1)

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

$ awk '{for(i=1;i<=NF;i++)if($i==0) print $1}' file
c                                                      
d        
  • 您需要将代码放入一个块({}对)中。
  • 在if条件中,您必须使用$i而不是i$i表示第i列。
  • 尽管这里不需要,但最好在命令和参数之间添加一个空格。 (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( |$)/的缩写。
^表示行开始,$表示行结束。