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