uniq
似乎做了一些与 不同的事情uniq -u
,尽管两者的描述都是“只有独特的线条”。
这里有什么区别,他们做什么?
答案1
这应该很容易测试:
$ cat file
1
2
3
3
4
4
$ uniq file
1
2
3
4
$ uniq -u file
1
2
简而言之,uniq
如果不使用任何选项,则会删除除一个连续重复行实例之外的所有实例。 GNUuniq
手册规定为
如果没有选项,匹配的行将合并到第一次出现的位置。
尽管POSIX 说
[...] 在输出上写入每个输入行的一份副本。重复的相邻输入行的第二个和后续副本不应被写入。
使用该-u
选项,它会删除全部连续重复行的实例,并且仅留下从未重复的行。 GNUuniq
手册说
只打印唯一的行
POSIX 说
禁止写入输入中重复的行。
答案2
从独特(1):
NAME uniq - report or omit repeated lines DESCRIPTION ... With no options, matching lines are merged to the first occurrence. ... -u, --unique only print unique lines
如果我们尝试一下,我们会看到:
$ cat file
cat
dog
dog
bird
$ uniq file
cat
dog
bird
$ uniq -u file
cat
bird
您可以看到uniq
打印了重复行的第一个实例。 uniq -u
不打印任何重复的行。
答案3
考虑到原始发帖者对已接受答案的评论,我相信不同的示例可能有助于说明命令的差异和要点。
假设我们有一部分文本,由于某种原因,其中的行之间有重复的空行,并且在开头和结尾都有一个空行:
$ cat declaration_quote.txt
We hold these truths to be self-evident, that all men are created equal, that
they are endowed by their Creator with certain unalienable Rights, that among
these are Life, Liberty and the pursuit of Happiness.
如果您确定一个空行足够间距,您可以uniq
使用
- 上面和下面不重复的每一行(这里有文本的行以及开头和结尾的单个空行)和
- 每组相邻重复行中的一行(这里是空行,除了开头和结尾的一行)。
它不是 ”一切都只有一次“, 反而 ”每个连续组一次因为您将从每组空行中收到一个单独的空行。这已经不止一次了。此外,开头和结尾的空行会保留,因为紧邻上方或下方没有空行。
$ uniq declaration_quote.txt
We hold these truths to be self-evident, that all men are created equal, that
they are endowed by their Creator with certain unalienable Rights, that among
these are Life, Liberty and the pursuit of Happiness.
如果您决定根本不需要这样的双倍行距,则可以使用 来uniq -u
仅获取上面或下面的行中不立即重复的每一行。但仍然不是“只出现一次的东西“因为它不会删除单个空行(在开头和结尾),即使文本中还有许多其他空行。它是”只做不立即重复的事情”。
$ uniq -u declaration_quote.txt
We hold these truths to be self-evident, that all men are created equal, that
they are endowed by their Creator with certain unalienable Rights, that among
these are Life, Liberty and the pursuit of Happiness.