Elimine la fila completa solo si cada columna dentro de ella es $VAR1 o $VAR2

Elimine la fila completa solo si cada columna dentro de ella es $VAR1 o $VAR2

Tengo un archivo de texto donde el número de columna y fila siempre variará y quiero eliminar filas enteras del archivo de texto solo si cada columna que contiene es igual a $VAR1 o $VAR2. Por ejemplo:

Digamos $VAR1="X" y $VAR2="N" y quiero eliminar cualquier fila donde $VAR1 y $VAR2 formen toda la columna.

Este sería mi aporte:

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

Y este sería mi resultado deseado:

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

Puedo resolver esto con un bucle, pero me preguntaba si hay una forma poderosa de hacerlo, preferiblemente awk.

Respuesta1

$ 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

Aquí, transferimos los valores $VAR1y $VAR2a nuestro awkscript corto y sus variables y usando ala línea de comando.b-v

Dentro del awkscript, iteramos sobre los campos de cada línea, y si algún campo es diferente tanto del acomo del bvalor, imprimimos la línea completa y continuamos con la siguiente línea inmediatamente.

Si ningún campo es diferente de ambos ay b, no sucede nada (la línea no se imprime).

Respuesta2

Podría obtener los resultados deseados con la elección correcta de expresiones regulares. Nota: suponiendo que las variables del shell tengan caracteres suaves, es decir, aquellos que no se pueden interpretar como expresiones regulares especiales. En caso de que esto no sea cierto, puede poner las variables en \Q...\Econtexto.

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

información relacionada