跑步
printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | uniq --unique
Run Code Online (Sandbox Code Playgroud)
印刷
foo
bar
foo
lol
foo
Run Code Online (Sandbox Code Playgroud)
为什么要foo
打印三遍?不应该uniq --unique
删除它们吗?
此外,值得注意的是,似乎删除了所有重复项lol
。为什么删除了lol重复项,但没有删除foo重复项?
ter*_*don 11
uniq
man uniq
如果您希望它删除所有重复行,则需要对输入进行排序(from ):
描述
过滤来自 INPUT(或标准输入)的相邻匹配行,写入 OUTPUT(或标准输出)。
正如你在上面看到的,它只过滤相邻的匹配行。这就是lol
删除 s 的原因。所以在传递给你之前对你的数据进行排序uniq
:
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq
bar
foo
lol
Run Code Online (Sandbox Code Playgroud)
或者,使用 GNU sort
,跳过uniq
:
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort --unique
bar
foo
lol
Run Code Online (Sandbox Code Playgroud)
最后,如果您想完全删除出现多次的行(而不是保留一个副本,默认行为),请使用uniq -u
或--unique
在您的问题中使用:
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq -u
bar
Run Code Online (Sandbox Code Playgroud)
然而,在所有情况下,排序都是必要的。