uniq 怎么不够独特,还有 uniq --unique 呢?

uniq 怎么不够独特,还有 uniq --unique 呢?

以下是来自以下随机文件的命令帕斯特宾:

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

手册页不清楚该-u标志的作用。有什么建议吗?

答案1

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

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

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

答案2

简洁版本:

  • uniq, 没有-u, 使每行输出的独特的。
  • uniq -u只打印每一个唯一的行从输入

稍微长一点的版本:

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

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

当遇到一系列重复行时,uniq不带-u参数的 会打印该行的副本。 (它使输出的每一行独特的)。

通过参数-u,它打印该行的副本 - 重复的运行只是从输出中省略。

答案3

uniq POSIX 规范描述得很清楚:

-u
    Suppress the writing of lines that are repeated in the input.

-u选项 makeuniq不打印重复行。

大多数uniq实现使用字节比较,而 GNUuniq使用排序规则来过滤重复行。因此,它可能在某些区域设置中产生错误的结果,例如en_US.UTF-8区域设置:

$ printf '%b\n' '\U2460' '\U2461' | uniq

-u没有给你任何台词:

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

因此,您应该将 locale 设置为 来C获取字节比较:

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq

答案4

普通的:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

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

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

已排序

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

sort -u :没有两行重复

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

排序/唯一性:全部不同

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

计算不同的出现次数

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

仅不重复的行(不先排序)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

仅不重复的行(排序后)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

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

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

..算了

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

相关内容