下面的awk命令删除所有重复的行,如下所述:
awk '!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)
如果文本包含空行,则将删除除一个空行之外的所有内容。
如何在删除所有非空重复行的同时保留所有空行,仅使用awk?还请附上简要说明。
ter*_*don 13
或者
awk '!/./ || !seen[$0]++' file
Run Code Online (Sandbox Code Playgroud)
主要技巧是相同的,seen[$0]++在seen关联数组中创建一个条目,其键是当前行 ( $0)。因此,!seen[$0]++如果已经看到这条线,则为假。所述/./被检查行是否包含任何非空白字符,所以!/./匹配的非空行。与|| !seen[$0]++它结合 将忽略除空白行之外的所有重复行并打印其余行。
这是另一个awk解决方案,类似于@Thor 的答案,不那么简洁但更有效:
awk '!NF {print;next}; !($0 in a) {a[$0];print}' file
Run Code Online (Sandbox Code Playgroud)
有了这个,我们只检查a[$0]是否存在。如果没有,初始化它然后打印。在这种情况下,我们没有任何引用,a[$0]如果它存在就赋值。
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'
Run Code Online (Sandbox Code Playgroud)
您所要做的就是首先检查空行(真的是空行或只是空白行)。