2010-04-29 4 views
2

Im пытается понять, как работает логическая логика, когда я использую NOT. Для примера, используя AWKЯ не могу повернуть голову вокруг логики BOOLEAN, когда я использую NOT вместе с AND и OR

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

CORE 
PORT 
CORE 
PORT 
COREPORT 
CORE 
COREPORT 

И я хотел бы, чтобы удалить все строки COREPORT. То, как я думал, что я хотел бы сделать это с (НЕ CORE) И (НЕ PORT), например

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

Но когда я пытаюсь это Im на самом деле предполагается использовать OR вместо AND

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

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

ответ

1

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

Ваше булевское выражение должно быть истинным для линий, которые вы хотите использовать keep.

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

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

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

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

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 
0

Хорошим способом визуализации логики является Karnaugh map.

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

  • нет (а и б) такая же, как (не) или (не б)
  • нет (а или б) такая же, как (не) и (не б)

На самом деле, то, что вы хотите, не: (не CORE) и (не PORT) но: нет (CORE и PORT) который так же, как: (не CORE) или (не PORT)

+0

@Bq: Кстати, это называется Де Моргана законы. http://en.wikipedia.org/wiki/De_Morgan's_laws –

+0

Спасибо за ссылку, вот что я искал :) – Balroq

1

почему бы вам не сделать это таким образом

awk '/COREPORT/{next}1' file 
+0

+1. Это меня тоже задумалось. Почему бы не искать именно то, что вы пытаетесь искать вместо половины за раз? –