只有當整行中的每一列都是 $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到我們的短awk腳本及其在命令列上使用的變數a中。b-v

在腳本內部,我們迭代每行的字段,如果任何字段與和值awk不同,我們將列印整行並立即繼續下一行。ab

a如果沒有欄位與和不同b,則不會發生任何情況(不列印該行)。

答案2

您可以透過正確選擇正規表示式來獲得所需的結果。注意:假設 shell 變數具有平淡的字符,這表示那些不可解釋為正規表示式特殊的字符。如果這不成立,那麼您可以在\Q...\E上下文中覆蓋變數。

$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp

相關內容