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