Удалить всю строку, только если каждый столбец в ней равен $VAR1 или $VAR2

Удалить всю строку, только если каждый столбец в ней равен $VAR1 или $VAR2

У меня есть текстовый файл, в котором номера столбцов и строк всегда будут меняться, и я хочу удалить целые строки из txt-файла, только если каждый столбец в нем равен либо $VAR1, либо $VAR2. Например:

Допустим, $VAR1="X" и $VAR2="N", и я хочу удалить все строки, где $VAR1 и $VAR2 составляют весь столбец.

Вот мой вклад:

hajn 32 ahnnd namm 5 543 asfn F
X X N X X X N X
5739 dw 32eff Sfff 3 asd 3123 1

И вот что я хотел бы получить на выходе:

hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

Я могу решить эту проблему с помощью цикла, но мне интересно, есть ли эффективный способ сделать это в одну строку, желательно на awk.

решение1

$ VAR1=N
$ VAR2=X
$ awk -v a="$VAR1" -v b="$VAR2" '{ for (i=1; i<=NF; ++i) if ($i != a && $i != b) { print; next } }' file
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

Здесь мы передаем значения $VAR1и $VAR2в наш короткий awkскрипт, а его переменные aи bиспользуем -vв командной строке.

Внутри awkскрипта мы перебираем поля каждой строки, и если какое-либо поле отличается как от , так aи от bзначения, мы выводим всю строку целиком и немедленно переходим к следующей строке.

Если ни одно поле не отличается от aи b, ничего не происходит (строка не печатается).

решение2

Вы можете получить желаемые результаты с помощью grep, правильно выбрав регулярное выражение. Примечание: предположим, что переменные оболочки имеют простые символы, то есть те, которые не могут быть интерпретированы как специальные регулярные выражения. В случае, если это не так, вы можете заключить переменные в \Q...\Eконтекст.

$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp

Связанный контент