Tail

cat 大文件上的 X 行到 Y 行

  • July 27, 2020

假設我有一個巨大的文本文件(> 2GB),我只想到cat行(例如 57890000 到 57890010)XY

據我了解,我可以通過管道head進入tail或反之亦然來做到這一點,即

head -A /path/to/file | tail -B

或者

tail -C /path/to/file | head -D

其中A, B,CD可以從文件中的行數計算出來,XY.

但是這種方法有兩個問題:

  1. 您必須計算AB和。C``D
  2. 這些命令pipe之間的行數可能比我感興趣的要多得多(例如,如果我正在讀取一個大文件中間的幾行**)**

有沒有辦法讓 shell 使用並輸出我想要的行?(同時只提供XY)?

我建議sed解決方案,但為了完整起見,

awk 'NR >= 57890000 && NR <= 57890010' /path/to/file

在最後一行之後剪切:

awk 'NR < 57890000 { next } { print } NR == 57890010 { exit }' /path/to/file

速度測試(這裡在 macOS 上,YMMV 在其他系統上):

  • 100,000,000 行文件由seq 100000000 > test.in
  • 讀取線 50,000,000-50,000,010
  • 沒有特定順序的測試
  • real``bash由’s builtin報告的時間time
4.373  4.418  4.395    tail -n+50000000 test.in | head -n10
5.210  5.179  6.181    sed -n '50000000,50000010p;57890010q' test.in
5.525  5.475  5.488    head -n50000010 test.in | tail -n10
8.497  8.352  8.438    sed -n '50000000,50000010p' test.in
22.826 23.154 23.195    tail -n50000001 test.in | head -n10
25.694 25.908 27.638    ed -s test.in <<<"50000000,50000010p"
31.348 28.140 30.574    awk 'NR<57890000{next}1;NR==57890010{exit}' test.in
51.359 50.919 51.127    awk 'NR >= 57890000 && NR <= 57890010' test.in

這些絕不是精確的基準,但差異足夠清晰和可重複*,可以很好地了解每個命令的相對速度。

*:除了前兩個sed -n p;qhead|tail,它們似乎基本相同。

引用自:https://unix.stackexchange.com/questions/47407