2 个不稳定版本

0.2.0 2023年2月18日
0.1.0 2019年1月2日

#954 in 文本处理

MIT/Apache

8KB
115

sortuniq

sortuniq 提供了各种 | sort | uniq 构造的优化版本,这些构造在 shell 脚本中很常见。这种构造会找到输入中的所有唯一行,无论行顺序如何。

例如

1
2
3
2
1

变为

1
2
3

用法

在没有参数的情况下,| sortuniq 生成与 | sort | uniq 相同的 集合 结果,并立即产生。这有点令人不安。它们 不是 排序的,与原始不同。

| sortuniq -c 生成与 | sort | uniq -c 相似的输出。

局部

| sortuniq --local 将从流中删除 "局部" 重复项,再次立即进行。如果你的数据非常大,并且包含许多无用的值,而你只想获取最终的 uniq 值或其他关于流的某种想法,这可能会很有用。例如,对于一些看起来像的数据

one
two
ponies!
two
one
one
horses!
two
one
ponies!

| sortuniq --local --size-hint 3 将(立即)打印

one
two
ponies!
horses!
ponies!

它已删除许多 onetwo 条记录,但不能删除第二个 ponies!,因为它用完了 "内存"。您可以(任意地)增加 size-hint(默认值:64)。

使用 uniq 实际上无法做到这一点,因为它不能查看历史记录中的超过一行。

指示性基准测试

我取了一个千兆字节的渲染维基百科页面,并提取了 "单词",产生了超过 2 亿行。

对于这个输入

  • | sortuniq -c 需要花费 17.5 秒(单核)和 190MB 的内存(最大 RSS)
  • | sort | uniq -c 需要花费 111 秒(总用户时间 405 秒)和大约 4GB 的内存。

这提高了 6-23 倍的速度,并且内存提高了 21 倍。


以下是输入的一个子集(通过 wikiextractor| perl -pe 's/\b/\n/g;s/[ \t]//g' | egrep -v '^$'

Helena
Carroll
Helena
Winifred
Carroll
(
13
November
192831
March
2013
)
was
a
veteran
film
,
television
and
stage
actress
.

最常用的单词,不出所料

   1195445 by
   1229458 with
   1274390 on
   1360706 as
   1405234 for
   1416371 '
   1675168 is
   1777549 The
   1931603 -
   2074956 was
   3038885 "
   3462954 a
   3630791 to
   4267812 in
   4999315 and
   5732322 of
   8336207 .
   9153796 ,
  10748102 the

依赖项

~3MB
~41K SLoC