为什么 uniq 不够独特以至于还有 uniq --unique?

enf*_*ion 40 uniq

以下是来自pastebin的随机文件的命令:

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Run Code Online (Sandbox Code Playgroud)

手册页不清楚-u标志在做什么。有什么建议吗?

mur*_*uru 55

uniqwith-u跳过任何有重复的行。因此:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3
Run Code Online (Sandbox Code Playgroud)

通常,uniq最多打印一次行(假设输入已排序)。此选项实际上打印真正独特的行(不再出现)。

  • 也就是说,“uniq”可以称为“distinct”,因为它打印所有不同的行,而“uniq -u”打印所有唯一的行。 (13认同)

小智 45

精简版:

  • uniq, 没有-u, 使输出的每一行都是唯一的。
  • uniq -u只打印input 中的每个唯一行。

稍长的版本:

uniq用于处理具有重复行的文件,并且仅当这些行在输入中连续出现时。因此,就其目的而言,独特的线条是不会立即复制的线条。

uniq具有非常有限的短期记忆;它永远不会记住输入中是否较早出现一行,除非它是前一行——这就是为什么uniq经常与 配对sort。)

当它遇到一连串重复的行时uniq,不带-u参数的 打印该行的一个副本。(它使输出的每一行都是唯一的)。

使用-u参数,它打印该行的零个副本——重复的运行只是从输出中省略。

  • @Random832:它需要决定保留哪些欺骗(第一个,最后一个,其他的,可配置的),并且这个决定会影响全局的算法。麻烦。 (3认同)

cuo*_*glm 18

uniq POSIX 规范清楚地描述了它:

-u
    Suppress the writing of lines that are repeated in the input.
Run Code Online (Sandbox Code Playgroud)

-u选项使uniq不打印重复的行。

大多数uniq实现使用字节比较,而 GNUuniq使用整理顺序来过滤重复的行。因此它可能会在某些语言环境中产生错误的结果,例如在en_US.UTF-8语言环境中:

$ printf '%b\n' '\U2460' '\U2461' | uniq
?
Run Code Online (Sandbox Code Playgroud)

-u没有给你任何台词:

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>
Run Code Online (Sandbox Code Playgroud)

所以你应该将 locale 设置C为获取字节比较:

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq
?
?
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这里 _wrong_ 的内容并不像那些错误地对同②。至少 GNU `uniq` 与 `sort -u` 是一致的。 (3认同)

jmu*_*lee 8

普通的:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c
Run Code Online (Sandbox Code Playgroud)

uniq : 没有两个连续的重复行

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c
Run Code Online (Sandbox Code Playgroud)

排序

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c
Run Code Online (Sandbox Code Playgroud)

sort -u : 没有两行重复

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c
Run Code Online (Sandbox Code Playgroud)

排序/ uniq:全部不同

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c
Run Code Online (Sandbox Code Playgroud)

计数不同的事件

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c
Run Code Online (Sandbox Code Playgroud)

只有不重复的行(不先排序)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b
Run Code Online (Sandbox Code Playgroud)

只有不重复的行(排序后)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z
Run Code Online (Sandbox Code Playgroud)

uniq -d : 只打印重复的行,每组一个

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c
Run Code Online (Sandbox Code Playgroud)

..计数

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c
Run Code Online (Sandbox Code Playgroud)