如何使用 awk 删除重复行,同时保留所有空行?

如何使用 awk 删除重复行,同时保留所有空行?

以下awk命令删除所有重复行正如这里所解释的:

awk '!seen[$0]++'

如果文本包含空行,则除一个空行外的所有空行都将被删除。

如何保留所有空行同时删除所有非空重复行,仅使用awk?请同时附上简短的解释。

答案1

另一种选择是检查NF,例如:

awk '!NF || !seen[$0]++'

或者等价地:

awk '!(NF && seen[$0]++)'

答案2

或者

awk '!/./ || !seen[$0]++' file

主要技巧是相同的,在关联数组seen[$0]++中创建一个条目seen,其键是当前行 ( $0)。因此,!seen[$0]++如果已经看到这条线,则为假。正在/./检查该行是否包含任何非空白字符,因此!/./匹配非空白行。与 || !seen[$0]++它结合将忽略除空白行之外的所有重复行并打印其余行。

答案3

这是另一个awk解决方案,类似于@Thor的答案,不太简洁但更有效:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

这样,我们只检查a[$0]是否存在。如果没有,则初始化然后打印。在这种情况下,我们没有任何引用,也没有分配a[$0]它是否存在。

答案4

逻辑运算符 NOТ 移出括号:

awk '!(NF && seen[$0]++)'

相关内容