我有一个文本文件,其中列号和行号始终不同,并且仅当其中的每一列等于 $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
您可以通过正确选择正则表达式来获取所需的结果。注意:假设 shell 变量具有平淡的字符,这意味着那些不可解释为正则表达式特殊的字符。如果这不成立,那么您可以在\Q...\E
上下文中覆盖变量。
$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp