列内のすべての行が $VAR1 または $VAR2 のいずれかである場合にのみ、列全体を識別して削除します。

列内のすべての行が $VAR1 または $VAR2 のいずれかである場合にのみ、列全体を識別して削除します。

質問「行内のすべての列が $VAR1 または $VAR2 のいずれかである場合にのみ行全体を削除します」に似ています

しかし、代わりに列全体を削除することになり、列内のすべての行の構成に基づいている。

列と行番号が常に変化するテキスト ファイルがあり、その列内のすべての行が $VAR1 または $VAR2 に等しい場合にのみ、txt ファイルからすべての列全体を削除したいと考えています。例:

$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

関連情報