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