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