我有一张桌子
1 1
1 0
0 1
0 0
我想打印具有两组选择标准的行,这些标准由或者。
标准集 1:(第 1 列 >= 1 并且第 2 列 = 0)
或者
标准集 2:(第 1 列 = 0,第 2 列 >= 1)
预期输出是
1 0
0 1
我写过类似的东西但没有用
awk '($1>=1 && $2=0)||($1=0 && $2>=1) {print $0}'
有什么问题?
答案1
问题是您使用的是赋值运算符 ( =
) 而不是相等测试 ( ==
)。将零分配给某物的布尔结果是“假”。这就是为什么测试永远不会成功的原因。
惯用的awk
命令是
awk '($1 >= 1 && $2 == 0) || ($1 == 0 && $ 2 >= 1)'
不需要{ print $0 }
,因为这是任何没有操作的条件的默认操作。
如果您只想跳过第一列和第二列中具有相同值的行(为给定数据提供相同的输出):
awk '$1 != $2'
两种情况下的输出都是
1 0
0 1
答案2
答案3
替代egrep
解决方案:
egrep '^([1-9][0-9]* *0|0 *[1-9][0-9]*)$' file
输出:
1 0
0 1
答案4
您不需要使用 OR在两者之间,您甚至可以添加更多条件,只需将它们分别添加到单独的行上,将其保存在文本文件中,例如“criteria.awk”,然后像这样运行:awk -f criteria.awk table.dat
这是 awkscript 文件的内容:
{
if ($1 >= 1 && $2 == 0) print $0;
if($1 == 0 && $2 >=1) print $0;
}