Я пытаюсь понять, как работает логическая логика, когда я использую НЕ. Чтобы привести пример с использованием awk

У меня есть текстовый файл, содержащий

CORE
PORT
CORE 
PORT
COREPORT
CORE
COREPORT

И я хотел бы удалить все строки COREPORT. Я думал, что сделаю это с (НЕ ЯДРО) И (НЕ ПОРТ), например.

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

Но когда я пробую его, я на самом деле должен использовать ИЛИ вместо И.

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

Я был бы очень рад, если бы кто-нибудь мог объяснить, где мое мышление ошибочно, и очень рад, если бы это можно было визуализировать с помощью диаграммы Венна или чего-то вроде логической машины на kathyschrock

2
Balroq 29 Апр 2010 в 13:24

4 ответа

Лучший ответ

Я постараюсь передать интуицию или ваши логические выражения, по математике другие плакаты справились с этим очень хорошо.

Ваше логическое выражение должно быть истинным для строк, которые вы хотите сохранить .

  • ! PORT означает, что строка не содержит PORT
  • ! CORE означает, что строка не содержит CORE

Следовательно, ваше логическое выражение означает сохранение строк, которые в то же время не содержат PORT и не содержат CORE. Очевидно, в вашем файле таких строк нет ...

Вы должны использовать or, потому что то, что вы действительно хотите выразить, - это сохранить строки, которые не содержат одновременно PORT и CORE, но, как вы можете видеть, в приведенном выше утверждении есть только одно отрицание. Вы пытаетесь сказать что-то вроде: содержит ли строка PORT, содержит ли она также CORE, тогда я не хочу этого. И это !(/CORE/ && /PORT/), и используя логическую математику, вы также можете написать это /!CORE/||/!PORT/, как вы видели сами.

Вообще говоря, отрицательные утверждения трудно понять. Не только я так говорю. Например, Дамиан Конвей в Perl Best Practice указал на это и рекомендовал использовать положительные операторы, когда это возможно (и использовать оператор Perl unless вместо if, когда вы хотите отрицать условие ).

1
kriss 29 Апр 2010 в 15:16

Почему бы тебе не сделать это так

awk '/COREPORT/{next}1' file
1
ghostdog74 30 Апр 2010 в 11:49
+1. Это заставило меня задуматься. Почему бы не искать именно то, что вы ищете, а не половину за раз?
 – 
JUST MY correct OPINION
30 Апр 2010 в 15:56

Таблица истины приближается ...

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
0
Trevor Tippins 29 Апр 2010 в 13:38

Хороший способ визуализации логики - карта Карно.

Или, если вы хотите обрабатывать математические выражения, просто запомните следующее:

  • not (a и b) то же самое, что (not a) or (not b)
  • not (a или b) то же самое, что (not a) and (not b)

На самом деле, вы хотите не: (не CORE) и (не PORT) , а: не (CORE и PORT) , что то же самое, что: (not CORE) или (не ПОРТ)

0
mouviciel 29 Апр 2010 в 13:38
@Bq: кстати, они называются законами Де Моргана. en.wikipedia.org/wiki/De_Morgan's_laws
 – 
Trevor Tippins
29 Апр 2010 в 13:47