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


13

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

awk '!seen[$0]++'

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

如何仅使用保留所有空行,同时删除所有非空重复行awk?请也提供简短的说明。

Answers:


28

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

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

11

或者

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

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


我认为这应该是公认的答案。+1以作解释!
SS安妮

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

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


5

这是另一种awk解决方案,类似于@Thor的回答,简洁性不高,但效率更高:

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

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


我的288行测试文件没有测量任何明显的时差。但是,您的代码肯定是最易读的,因此备受青睐。
Serge Stroobandt,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.