Identifique e remova a coluna inteira somente se cada linha dentro dela for $VAR1 ou $VAR2

Identifique e remova a coluna inteira somente se cada linha dentro dela for $VAR1 ou $VAR2

semelhante à pergunta 'Remover linha inteira somente se todas as colunas dentro dela forem $VAR1 ou $VAR2'

MAS é para remover uma COLUNA inteira e é baseado na composição de cada LINHA na coluna

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

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

Esta seria minha entrada:

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

E esta seria minha saída desejada:

hajn 32 ahnnd namm 543 asfn F
namd 90 jsnfu namm 098 asfn S
5739 dw 32eff Sfff 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

Veja isso.

$ 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 com uma expressão if e uma expressão or ||dentro e, em caso afirmativo, exclua a coluna # 5 e imprima o restante dos dados.

$ 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

Responder2

Tentei com o método abaixo e funcionou bem também

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

saída

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

Responder3

Você precisará armazenar as linhas porque a decisão de eliminar qualquer coluna não poderá ser tomada até que a última linha tenha sido examinada.

$ 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

informação relacionada