以下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]++)'