【问题标题】:unix command: how to get top n recordsunix 命令:如何获取前 n 条记录
【发布时间】:2014-06-16 22:36:53
【问题描述】:

我想使用 unix 命令获取前 n 条记录:

例如 输入:

  • 1个
  • 2 b
  • 3 c
  • 4 天
  • 5 电子

输出(获得前 3 名):

  • 5e
  • 4 天
  • 3 c

目前我正在做的事情:

cat myfile.txt | sort -k1nr | head -3 > my_output.txt

它工作正常,但是当文件变大时,它变得很慢。

它很慢,因为它完全对文件进行排序,而我需要的只是前 3 条记录。

我可以使用任何命令来获取前 3 条记录吗?

【问题讨论】:

  • 请参阅以下内容以获得好的答案:stackoverflow.com/questions/7074430/… Unix sort,到目前为止,这并不是对大文件进行排序的最快方法。如果您的输入有那么大,您需要考虑一种不同的方法。那个链接的 SO 帖子应该会有所帮助。
  • 基本同意一般情况。但是,给定一个固定的 N,您可以在一个专用程序中单次遍历输入,保持前 N 个可见。优先级队列可能很方便。廉价查看最低条目和条目计数,对于每条记录,如果记录值 > 最低,则插入;如果 count >= limit,则删除最小值。

标签: shell sorting unix scripting


【解决方案1】:
perl -ane '
    BEGIN {@top = ([-1]) x 3} 
    if ($F[0] > $top[0][0]) {
        @top = sort {$a->[0] <=> $b->[0]} @top[1,2], [$F[0], $_];
    } 
    END {print for reverse map {$_->[1]} @top}
' << END_DATA
1 a
2 b
3 c
4 d
5 e
END_DATA
5 e
4 d
3 c

【讨论】:

    【解决方案2】:

    您是否尝试过更改命令的顺序?

    像这样。

    排序-k1nr myfile.txt |头 -3 > my_output.txt

    【讨论】:

    • 这对sort 必须做的工作没有任何影响,这是真正的问题。
    • 它将加快对较大文件的执行速度。只要你能消除一个过程,你就会获得速度。允许 sort 直接在文件上工作,而不必先阅读它。对 2GB 文件进行排序节省了整整一分钟。当然,首先在一台 10 年前的计算机上运行 cat 需要 9 分钟。 ;)
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2021-03-15
    • 2021-09-01
    • 2018-11-09
    相关资源
    最近更新 更多