У меня есть текстовый файл, в котором номера столбцов и строк всегда будут меняться, и я хочу удалить целые строки из 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