仅当整行中的每一列都是 $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

相关内容