列のすべての行が$ 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

if式および/または式と一緒にawkを使用し||、その場合はcloumn#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

関連情報