【发布时间】: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}我遇到语法错误
谢谢。
【问题讨论】:
示例输入:
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}我遇到语法错误
谢谢。
【问题讨论】:
另一种方法
$ awk '/\y0\y/{print $1}' file
c
d
\y 是字边界运算符。可能只在gawk。
【讨论】:
代码需要一组大括号。
awk '{ for(i=1;i<=NF;i++)if($i==0) print $1}' filename
(print 不需要大括号,所以我把它们拿出来了。)
如果第一个字段不包含数字,则可能从 2 开始循环。
Awk 脚本的一般形式是一系列
condition { action }
pairs,后者需要大括号围绕它。在没有条件的情况下,将无条件地对每一行执行操作。
【讨论】:
.awk 文件,所以我没有在代码中包含大括号。
要使您的代码正常工作,您需要将其更改为:
$ awk '{for(i=1;i<=NF;i++)if($i==0) print $1}' file
c
d
{} 对)。$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( |$)/ 的缩写。^ 表示行首,$ 行尾在这里.
【讨论】: