我可以使用哪些标准命令有效地在命令行上打印排序输出的前几行?

jdo*_*ell 6 unix linux bash

我基本上想要相当于

... | sort -arg1 -arg2 -... | head -n $k
Run Code Online (Sandbox Code Playgroud)

但是,我的理解是排序将在整个输入上变为O(n log n).在我的情况下,我正在处理大量数据,因此运行时对我很重要 - 而且我还有一个习惯是使用排序临时文件溢出我的tmp /文件夹.

我宁愿让它用O(n log k)使用例如堆,这可能会更快,并且还将工作集内存减少到k.

是否有一些标准命令行工具的组合可以有效地执行此操作,而无需我自己编写代码?理想情况下,它将支持sort命令的完全表达排序功能.sort(至少在ubuntu上)似乎没有man-page记录的开关来将它拉下来......

jim*_*ara 1

UNIX/Linux 提供了通才工具集。对于大型数据集,它会执行大量 I/O。它会做你想做的一切,但速度很慢。如果我们了解输入数据,那将会有很大帮助。

IMO,你有一些选择,但没有一个是你真正喜欢的。

  1. 进行多部分“基数”预排序 - 例如,让 awk 将所有键以 'A' 开头的行写入一个文件,将 'B' 写入另一个文件,等等。或者如果您只写入 'P' 'D' 和 'Q ',让 awk 吸出你想要的东西。然后对一个小子集进行完整排序。这将创建 26 个名为 A、B ...Z 的文件

    awk '{print $0 > substr($0,1,1)} 大文件;排序 [此处的选项] PDQ > 结果

  2. 花费 $$:(示例)从iri.com 任何其他排序软件购买 CoSort。这些类型使用各种优化,但它们不像 bash 那样免费。您还可以购买 SSD,它可以将磁盘排序速度提高几个数量级。5000iops现在到75000iops. 使用该TMPDIR变量将您的 tmp 文件放在 SSD 上,仅读取和写入 SSD。但请使用现有的 UNIX 工具集。

  3. 使用一些软件,如R或strata,或者最好是数据库;所有这些都是针对大型数据集的。

  4. 做你现在正在做的事情,但是在 UNIX 排序运行时观看 youtube。

IMO,当您想要快速获得结果时,您对大型数据集使用了错误的工具。