Tail
cat 大文件上的 X 行到 Y 行
假設我有一個巨大的文本文件(> 2GB),我只想到
cat
行(例如 57890000 到 57890010)X
。Y
據我了解,我可以通過管道
head
進入tail
或反之亦然來做到這一點,即head -A /path/to/file | tail -B
或者
tail -C /path/to/file | head -D
其中
A
,B
,C
和D
可以從文件中的行數計算出來,X
和Y
.但是這種方法有兩個問題:
- 您必須計算
A
、B
和。C``D
- 這些命令
pipe
之間的行數可能比我感興趣的要多得多(例如,如果我正在讀取一個大文件中間的幾行**)**有沒有辦法讓 shell 使用並輸出我想要的行?(同時只提供
X
和Y
)?
我建議
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;q
和head|tail
,它們似乎基本相同。