awk中选择两组条件

awk中选择两组条件

我有一张桌子

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

awk除了您在命令中使用=而不是==进行比较时遇到的问题之外善行难陀 指出。据我从您的输入和您正在使用的命令中了解到,当至少其中之一为零时,您需要这些行)。

假设您没有负值,那么您可以使用:

awk '($1 && !$2) || (!$1 && $2)' infile

甚至更短(您-也可以使用)。

awk '($1 * !$2) + (!$1 * $2)' infile

答案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;
}

相关内容