以下是来自以下随机文件的命令帕斯特宾:
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
uniq
with-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