行のすべての列が$ VAR1または$ VAR2の場合にのみ、行全体を削除します。

行のすべての列が$ VAR1または$ VAR2の場合にのみ、行全体を削除します。

列と行番号が常に異なるテキストファイルがあり、そのファイルの各列が$ 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スクリプトとその変数を転送します。awkab-v

スクリプト内で各行のフィールドを繰り返し、フィールドがawk合計値と異なる場合は、行全体を印刷してすぐに次の行を続行します。ab

aフィールドと異なる場合、b何も起こりません(行は印刷されません)。

おすすめ記事