样本输入:
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}
我遇到语法错误
谢谢。
答案 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
{}
对)中。$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( |$)/
的缩写。
^
表示行开始,$
表示行结束。