Remova a linha inteira somente se todas as colunas dentro dela forem $VAR1 ou $VAR2

Remova a linha inteira somente se todas as colunas dentro dela forem $VAR1 ou $VAR2

Eu tenho um arquivo de texto onde o número da coluna e da linha sempre varia e desejo remover linhas inteiras do arquivo txt somente se cada coluna dentro dele for igual a $VAR1 ou $VAR2. Por exemplo:

Digamos $VAR1="X" e $VAR2="N" e quero remover qualquer linha onde $VAR1 e $VAR2 constituem a coluna inteira.

Esta seria minha entrada:

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

E esta seria minha saída desejada:

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

Posso resolver isso com um loop, mas queria saber se existe uma maneira poderosa de fazer isso, de preferência awk.

Responder1

$ 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

Aqui, transferimos os valores $VAR1e $VAR2para nosso awkscript curto e suas variáveis a​​e usando a linha de comando.b-v

Dentro do awkscript, iteramos sobre os campos de cada linha e, se algum campo for diferente de e ado bvalor, imprimimos a linha completa e continuamos com a próxima linha imediatamente.

Se nenhum campo for diferente de ae b, nada acontece (a linha não é impressa).

Responder2

Você poderia obter os resultados desejados com a escolha certa de regex. Nota: supondo que as variáveis ​​​​do shell tenham caracteres insípidos, ou seja, aqueles que não são interpretáveis ​​​​como especiais de regex. Caso isso não seja verdade, você pode revestir os vars no \Q...\Econtexto.

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

informação relacionada