使用bash命令打印文件某个部分的最快方法

Sha*_*ala 6 bash shell sed

目前我使用sed打印文件的所需部分.例如,我使用了以下命令

sed -n 89001,89009p file.xyz
Run Code Online (Sandbox Code Playgroud)

但是,随着文件大小的增加,它的速度非常慢(我的文件目前是6.8 GB).我试图按照此链接使用该命令

sed -n '89001,89009{p;q}' file.xyz
Run Code Online (Sandbox Code Playgroud)

但是,此命令仅打印第89001行.请帮助我.

Daw*_*ski 8

语法有点不同:

sed -n '89001,89009p;89009q' file.xyz
Run Code Online (Sandbox Code Playgroud)

更新:

既然awk也有答案,我做了一个小比较,正如我想的那样 - sed有点快:

$ wc -l large-file 
100000000 large-file
$ du -h large-file 
954M    large-file
$ time sed -n '890000,890010p;890010q' large-file > /dev/null

real    0m0.141s
user    0m0.068s
sys 0m0.000s
$ time awk 'NR>=890000{print} NR==890010{exit}' large-file > /dev/null

real    0m0.433s
user    0m0.208s
sys 0m0.008s`
Run Code Online (Sandbox Code Playgroud)

UPDATE2:

有一个更快的方式使用awk,由@EdMorton发布,但仍然不如sed快:

$ time awk 'NR>=890000{print; if (NR==890010) exit}' large-file > /dev/null

real    0m0.252s
user    0m0.172s
sys     0m0.008s
Run Code Online (Sandbox Code Playgroud)

更新:

这是我能找到的最快的方式(头部尾部):

$ time head -890010 large-file| tail -10 > /dev/null

real    0m0.085s
user    0m0.024s
sys     0m0.016s
Run Code Online (Sandbox Code Playgroud)

  • @DawidGrabowski请测试'awk'的速度NR> = 890000 {print; if(NR == 890010)exit}'large-file`(参见[我的回答](http://stackoverflow.com/a/39181709/1745001)) - 这应该比你已经测试过的awk脚本快得多它没有冗余地测试第一个889999行的第二个条件,只是从890000开始的10行.顺便说一下 - 希望你报告每个命令的第3个执行时间,以从等式中删除缓存. (3认同)
  • 您可以使用第二个数字89009两次 - 这比必须将一个数字添加到范围的第二个数字更简单.也就是说,`sed -n"$ {line1},$ {line2} p; $ {line2} q"`可以很好地工作在`line1 = 89001`和`line2 = 89009`,可能是从命令行参数中选择的. (2认同)