Я пытаюсь понять, как работает логическая логика, когда я использую НЕ. Чтобы привести пример с использованием awk
У меня есть текстовый файл, содержащий
CORE
PORT
CORE
PORT
COREPORT
CORE
COREPORT
И я хотел бы удалить все строки COREPORT. Я думал, что сделаю это с (НЕ ЯДРО) И (НЕ ПОРТ), например.
awk '/!CORE/&&/!PORT/{print}'
Но когда я пробую его, я на самом деле должен использовать ИЛИ вместо И.
awk '/!CORE/||/!PORT/{print}'
Я был бы очень рад, если бы кто-нибудь мог объяснить, где мое мышление ошибочно, и очень рад, если бы это можно было визуализировать с помощью диаграммы Венна или чего-то вроде логической машины на kathyschrock
4 ответа
Я постараюсь передать интуицию или ваши логические выражения, по математике другие плакаты справились с этим очень хорошо.
Ваше логическое выражение должно быть истинным для строк, которые вы хотите сохранить .
- ! PORT означает, что строка не содержит PORT
- ! CORE означает, что строка не содержит CORE
Следовательно, ваше логическое выражение означает сохранение строк, которые в то же время не содержат PORT и не содержат CORE. Очевидно, в вашем файле таких строк нет ...
Вы должны использовать or
, потому что то, что вы действительно хотите выразить, - это сохранить строки, которые не содержат одновременно PORT и CORE, но, как вы можете видеть, в приведенном выше утверждении есть только одно отрицание. Вы пытаетесь сказать что-то вроде: содержит ли строка PORT, содержит ли она также CORE, тогда я не хочу этого. И это !(/CORE/ && /PORT/)
, и используя логическую математику, вы также можете написать это /!CORE/||/!PORT/
, как вы видели сами.
Вообще говоря, отрицательные утверждения трудно понять. Не только я так говорю. Например, Дамиан Конвей в Perl Best Practice указал на это и рекомендовал использовать положительные операторы, когда это возможно (и использовать оператор Perl unless
вместо 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
Хороший способ визуализации логики - карта Карно.
Или, если вы хотите обрабатывать математические выражения, просто запомните следующее:
- not (a и b) то же самое, что (not a) or (not b)
- not (a или b) то же самое, что (not a) and (not b)
На самом деле, вы хотите не: (не CORE) и (не PORT) , а: не (CORE и PORT) , что то же самое, что: (not CORE) или (не ПОРТ)
Похожие вопросы
Новые вопросы
awk
AWK - это интерпретируемый язык программирования, разработанный для обработки текста и обычно используемый в качестве инструмента извлечения данных и составления отчетов. AWK используется в основном с системами Unix.