2014-06-16 25 views
3

我想使用unix命令獲得前n個記錄:unix命令:如何獲取前n個記錄

輸入:

  • 2 B
  • 3c中
  • 4 d
  • 5e中

輸出(得到頂部3):

  • 5 e
  • 4 d
  • 3c的

現在我做:

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

它工作正常,但是當文件變大,就變得非常慢。

它很慢,因爲它完全排序文件,而我需要的只是前3條記錄。

是否有任何命令可以用來獲得前3條記錄?

+0

見一個很好的答案如下:http://stackoverflow.com/questions/7074430/how-do-we-sort-faster-using- unix-sort Unix'sort'目前還不是排序大文件的最快方法。如果你的意見很大,你需要看一個不同的方法。鏈接SO帖子應該有所幫助。 –

+1

大體上同意一般情況。但是,給定一個固定的N,你可以在一個專門的程序中通過輸入保持前N個。優先隊列可能會很方便。用低價查看最低的條目和條目數量,對於每條記錄,如果記錄值>最低,則插入;如果count> = limit,則刪除最低。 – dbrower

回答

-1

您是否嘗試過更改命令的順序?

像這樣。

sort -k1nr myfile.txt |頭-3> my_output.txt

+1

這不會影響'sort'所做的工作,這是真正的問題。 – chepner

+0

此外,這已經是幾天了:) – konsolebox

+1

它會加快執行大文件。任何時候你可以消除一個過程,你會獲得速度。允許排序直接在文件上工作,而不必先讀取它。整理一個2GB的文件,整整一分鐘。當然,在一臺10年的計算機上,它首先耗費了9分鐘的時間。 ;) – MPH426

0
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