2

我试图了解当我使用 NOT 时布尔逻辑是如何工作的。举一个使用 awk 的例子

我有一个文本文件包含

CORE
PORT
CORE 
PORT
COREPORT
CORE
COREPORT

我想删除所有 COREPORT 行。我认为我会这样做的方式是(非核心)和(非端口),例如

awk '/!CORE/&&/!PORT/{print}'

但是当我尝试它时,我实际上应该使用 OR 而不是 AND

awk '/!CORE/||/!PORT/{print}'

如果有人能解释我的想法在哪里是错误的,我会非常高兴,如果可以用维恩图或类似kathyschrock的布尔机器之类的东西来可视化,我会非常高兴

4

4 回答 4

1

你为什么不这样做

awk '/COREPORT/{next}1' file
于 2010-04-30T07:49:16.497 回答
1

我会尝试给出一种直觉或你的布尔表达式,因为其他海报在数学上做得很好。

对于要保留的行,您的布尔表达式必须为真。

  • !PORT 表示该行不包含 PORT
  • !CORE 表示该行不包含 CORE

因此,您的布尔表达式意味着保留同时不包含 PORT 且不包含 CORE 的行。显然你的文件中没有这样的行......

您必须使用or,因为您真正想要表达的是保留不包含 PORT 和 CORE 的行,但正如您所见,上述语句中只有一个否定。您想说的是:行是否包含 PORT,是否还包含 CORE,然后我不想要它。也就是说!(/CORE/ && /PORT/),使用布尔数学你也可以写出/!CORE/||/!PORT/你自己看到的那样。

一般来说,否定的断言很难理解。我不是唯一一个这么说的人。例如,Perl Best Practice中的 Damian Conway指出了这一点,并建议尽可能使用肯定语句(并且在您想要否定条件时使用unlessPerl 运算符而不是)。if

于 2010-04-29T09:56:17.233 回答
0

真值表来了……

CORE   PORT   !CORE   !PORT   AND(!CORE,!PORT)  OR(!CORE,!PORT)
 T       T      F       F            F                F
 T       F      F       T            F                T
 F       T      T       F            F                T
 F       F      T       T            T                T
于 2010-04-29T09:38:24.220 回答
0

可视化逻辑的一个好方法是卡诺图

或者,如果您想处理数学表达式,请记住:

  • not (a and b)(not a) 或 (not b)相同
  • not (a or b)(not a) and (not b)相同

实际上,您想要的不是:(not CORE) and (not PORT) but: not (CORE and PORT)这与:(not CORE) or (not PORT)相同

于 2010-04-29T09:38:37.633 回答