列と行番号が常に異なるテキストファイルがあり、そのファイルの各列が$ VAR1または$ VAR2と等しい場合にのみ、txtファイルから行全体を削除します。たとえば、
$VAR1="X" と $VAR2="N" と仮定すると、$VAR1 と $VAR2 が列全体を構成する行を削除したいと思います。
これが私の入力になります:
hajn 32 ahnnd namm 5 543 asfn F
X X N X X X N X
5739 dw 32eff Sfff 3 asd 3123 1
これが私が望む結果です。
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1
ループを使用してこの問題を解決できますが、これを行う強力な一行方法があるかどうかを知りたいです。可能な限りawkを使用することをお勧めします。
答え1
$ VAR1=N
$ VAR2=X
$ awk -v a="$VAR1" -v b="$VAR2" '{ for (i=1; i<=NF; ++i) if ($i != a && $i != b) { print; next } }' file
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1
ここでは、コマンドラインで使用できるように、値と$VAR1
短い$VAR2
スクリプトとその変数を転送します。awk
a
b
-v
スクリプト内で各行のフィールドを繰り返し、フィールドがawk
合計値と異なる場合は、行全体を印刷してすぐに次の行を続行します。a
b
a
フィールドと異なる場合、b
何も起こりません(行は印刷されません)。
答え2
正規表現を正しく選択すると、目的の結果が得られます。注:シェル変数には通常の文字があると見なされます。つまり、正規表現特殊文字として解釈されない文字を意味します。これが維持されない場合は、\Q...\E
コンテキストで変数をオーバーライドできます。
$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp