аналогично вопросу «Удалить всю строку, только если каждый столбец в ней равен $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