使用 awk、sed 或其他東西從大量文件中列印行的有效方法?

使用 awk、sed 或其他東西從大量文件中列印行的有效方法?

如果我有一個包含 800 萬行的純文字文件,並且我想將第 4,000,010 到 4,000,000 行列印到螢幕上,哪個會更有效:awk 還是 sed?

文字沒有模式,不幸的是,資料庫不是一個選項。我知道這並不理想,我只是好奇誰能更快完成任務。

或者也許還有 sed 或 awk 更好的替代方案?

答案1

兩者都不是,使用tailorhead代替:

$ time tail -n 4000001 foo | head -n 11
real    0m0.039s
user    0m0.032s
sys     0m0.004s

$ time head -n 4000010 foo | tail -n 11
real    0m0.055s
user    0m0.064s
sys     0m0.036s

tail事實上始終更快。我運行這兩個命令 100 次併計算它們的平均值:

尾巴:

real    0.03962
user    0.02956
sys     0.01456

頭:

real    0.06284
user    0.07356
sys     0.07244

我認為tail速度更快,因為雖然它必須一直尋找到第 4e10 行,但它實際上不會列印任何內容,直到它到達那裡,而head會列印所有內容直到第 4e10 + 10 行。


與其他一些按時間順序排序的方法相比:

sed:

$ time sed -n 4000000,4000011p;q foo
real    0m0.312s
user    0m0.236s
sys     0m0.072s

珀爾:

$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo 
real    0m1.000s
user    0m0.936s
sys     0m0.064s

awk:

$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo 
real    0m0.955s
user    0m0.868s
sys     0m0.080s

基本上,規則是解析的越少,速度就越快。將輸入視為只需要列印到螢幕上的資料流(就像tail以前一樣)始終是最快的方法。

相關內容