Identifique y elimine la columna completa solo si cada fila dentro de ella es $VAR1 o $VAR2

Identifique y elimine la columna completa solo si cada fila dentro de ella es $VAR1 o $VAR2

similar a la pregunta 'Eliminar toda la fila sólo si cada columna dentro de ella es $VAR1 o $VAR2'

PERO es para eliminar una COLUMNA completa, y se basa en la composición de cada FILA de la columna

Tengo un archivo de texto donde el número de columna y fila siempre variará y quiero eliminar la totalidad de las columnas del archivo de texto solo si cada fila dentro de dicha columna es igual a $VAR1 o $VAR2. Por ejemplo:

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

Este sería mi aporte:

hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

Y este sería mi resultado deseado:

hajn 32 ahnnd namm 543 asfn F
namd 90 jsnfu namm 098 asfn S
5739 dw 32eff Sfff asd 3123 1

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

Respuesta1

Mira esto.

$ cat data
hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

Usando awk con una expresión if y una expresión or ||dentro y, de ser así, excluya la columna n.° 5 e imprima el resto de los datos.

$ awk '{ if ($5=="X" || $5=="N") { $5=""; print } }' < data
hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

Respuesta2

Probé con el método siguiente y también funcionó bien.

VAR1="X"
VAR2="N"

Count_of_columns=`awk '{print NF}' filename| sort -nr| sed -n '$p'` 

for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v VAR1="$VAR1" -v VAR2="$VAR2" '$i == VAR1||$i == VAR2{$i="";print $0}' filename; done

producción

hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

Respuesta3

Necesitará almacenar las líneas porque la decisión de eliminar cualquier columna no se puede tomar hasta que se haya examinado la última línea.

$ perl -lane '
    push @{$A[$.]}, @F;my $i;
    $h[$i++] ||= !/X/ && !/N/ for @F}{
    my @I2P = grep { $h[$_] } 0 .. $#h;
    print join $", @{$A[$_]}[@I2P] for 1 ..  $#A;
' inp

información relacionada