我试图理解当我使用 NOT 时布尔逻辑是如何工作的。举一个使用 awk 的例子
我有一个文本文件包含
CORE
PORT
CORE
PORT
COREPORT
CORE
COREPORT
我想删除所有 COREPORT 线。我认为我会这样做的方式是(不是核心)和(不是端口)例如
awk '/!CORE/&&/!PORT/{print}'
但是当我尝试时,我实际上应该使用 OR 而不是 AND
awk '/!CORE/||/!PORT/{print}'
如果有人能解释我的想法哪里错了,我会非常高兴,如果可以用维恩图或类似布尔机之类的东西将其可视化,我会非常高兴kathyschrock
我会尝试给出一种直觉或你的布尔表达式,对于数学,其他海报做得很好。
对于您想要保留的行,您的布尔表达式必须为真。
因此,您的布尔表达式意味着保留同时不包含 PORT 和不包含 CORE 的行。显然你的文件中没有这样的行...
你必须使用
or
,因为你真正想要表达的是保留不包含PORT和CORE的行,但正如你所看到的,上面的语句中只有一个否定。你试图说这样的话:线是否包含 PORT,它是否也包含 CORE 那么我不想要它。这就是 !(/CORE/ && /PORT/)
,使用布尔数学你也可以写出 /!CORE/||/!PORT/
,就像你自己看到的那样。
一般而言,负面断言很难理解。我不是唯一这么说的人。例如,Damian Conway 在 Perl Best Practice 中指出了这一点,并建议尽可能使用肯定语句(当您想要否定某个条件时,请使用
unless
Perl 运算符而不是 if
)。
你为什么不这样做
awk '/COREPORT/{next}1' file
真相表即将推出...
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
可视化逻辑的一个好方法是卡诺图。
或者,如果您想处理数学表达式,请记住:
实际上,你想要的不是:(不是CORE)和(不是PORT)而是:不是(CORE和PORT),这与:(不是CORE)或(不是PORT)
相同关于 NOR 和 NAND 的快速说明,从 NOR 开始:
not (A or B)
假设如果两个
A
都是 B
代表布尔表达式 OUTCOMES,即 A
/B
已经在 1 (true) / 0 (false)
中,那么可以用更简短的方法来合并 NOR 表达式会是A is less than not-B
:
A < not B
类似地,NAND 表达式如
not (A and B)
可以做成
(not-A)-to-the-power-of-B
(not A)^B
如果您更喜欢算术变体
NAND := A + B < 2
NOR := A + B < 1