如何在保留空行的同时使用 awk 删除重复行?

Ser*_*ndt 15 awk

下面的awk命令删除所有重复的行,如下所述

awk '!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)

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

如何在删除所有非空重复行的同时保留所有空行,仅使用awk?还请附上简要说明。

Tho*_*hor 31

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

awk '!NF || !seen[$0]++'
Run Code Online (Sandbox Code Playgroud)


ter*_*don 13

或者

awk '!/./ || !seen[$0]++' file
Run Code Online (Sandbox Code Playgroud)

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


cuo*_*glm 6

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

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file
Run Code Online (Sandbox Code Playgroud)

有了这个,我们只检查a[$0]是否存在。如果没有,初始化它然后打印。在这种情况下,我们没有任何引用,a[$0]如果它存在就赋值。


Hau*_*ing 5

awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'
Run Code Online (Sandbox Code Playgroud)

您所要做的就是首先检查空行(真的是空行或只是空白行)。