【问题标题】:I cant really wrap my head around BOOLEAN logic when I use NOT together with AND and OR当我将 NOT 与 AND 和 OR 一起使用时,我无法真正理解布尔逻辑
【发布时间】:2011-02-13 17:36:24
【问题描述】:

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

我有一个包含

的文本文件
CORE
PORT
CORE 
PORT
COREPORT
CORE
COREPORT

我想删除所有 COREPORT 行。我认为我会这样做的方式是使用 (NOT CORE) AND (NOT PORT) 例如

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

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

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

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

【问题讨论】:

    标签: awk boolean boolean-logic boolean-expression


    【解决方案1】:

    真值表来了……

    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
    

    【讨论】:

      【解决方案2】:

      可视化逻辑的好方法是Karnaugh map

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

      • not (a and b) 等同于 (not a) 或 (not b)
      • not (a or b) 等同于 (not a) and (not b)

      其实你想要的不是:(not CORE) and (not PORT) 而是:not (CORE and PORT) 和:(非核心)或(非端口)

      【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        你为什么不这样做

        awk '/COREPORT/{next}1' file
        

        【讨论】:

        • +1。这也让我感到疑惑。为什么不准确查找您要查找的内容,而不是一次查找一半?
        猜你喜欢
        • 2022-08-24
        • 2020-08-07
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多