Определить и удалить весь столбец, только если каждая строка в нем представляет собой $VAR1 или $VAR2

Определить и удалить весь столбец, только если каждая строка в нем представляет собой $VAR1 или $VAR2

аналогично вопросу «Удалить всю строку, только если каждый столбец в ней равен $VAR1 или $VAR2»

НО вместо этого нужно удалить целый СТОЛБЕЦ, и это основано на составе каждой СТРОКИ в столбце.

У меня есть текстовый файл, в котором номер столбца и строки всегда будет меняться, и я хочу удалить все столбцы из файла txt, только если каждая строка в указанном столбце равна либо $VAR1, либо $VAR2. Например:

Допустим, $VAR1="X" и $VAR2="N", и я хочу удалить все столбцы, где $VAR1 и $VAR2 составляют весь столбец.

Вот мой вклад:

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

И вот что я хотел бы получить на выходе:

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

Я могу решить эту проблему с помощью цикла, но мне интересно, есть ли эффективный способ сделать это в одну строку, желательно на awk.

решение1

Проверь это.

$ 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

Используем awk с if-выражением и or-выражением ||внутри, и если да, то исключаем столбец №5 и выводим остальные данные.

$ 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

решение2

Попробовал с помощью метода ниже, и он тоже отлично сработал

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

выход

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

решение3

Вам необходимо будет сохранить строки, поскольку решение об удалении любого столбца не может быть принято, пока не будет проверена последняя строка.

$ 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

Связанный контент