首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从大型文本文件中读取行组

从大型文本文件中读取行组
EN

Stack Overflow用户
提问于 2017-01-03 20:19:21
回答 2查看 185关注 0票数 1

我希望从大型文本文件(~870,000,000行)中提取某些行组。例如,在50行文件中,我可能需要第3-6、18-27和39-45行。

通过浏览堆栈溢出,我发现bash命令:

代码语言:javascript
运行
复制
tail -n+NUMstart file |head -nNUMend

是获得一行或一组行的最快方法,从NUMstart开始,再到NUMend。然而,当读取多组行时,这似乎是效率低下的。通常情况下,这一技术并不那么重要,但是对于这么大的文件,它会产生巨大的影响。

有比对每组行使用上面的命令更好的方法吗?我假设答案很可能是bash命令,但实际上对任何语言/工具都是开放的,这些语言/工具将做得最好。

EN

回答 2

Stack Overflow用户

发布于 2017-01-03 20:35:07

awk去营救!

代码语言:javascript
运行
复制
 awk -v lines='3-6,18-27,39-45' '
       BEGIN {n=split(lines,a,","); 
              for(i=1;i<=n;i++) 
                {split(a[i],t,"-"); 
                 rs[++c]=t[1]; re[c]=t[2]}} 

             {for(i=s;i<=c;i++) 
              if(NR>=rs[i] && NR<=re[i]) {print; next} 
              else if(NR>re[i]) s++; 
              if(s>c) exit}' file

提供上次打印行之后的早期退出。没有错误检查,范围应按递增顺序提供。

票数 1
EN

Stack Overflow用户

发布于 2017-01-03 20:24:24

tail -n XX file | head -n YY针对不同范围的问题是,您要运行它几次,因此效率低下。否则,benchmarks认为它们是最好的解决方案。

对于这种特殊情况,您可能需要使用awk

代码语言:javascript
运行
复制
awk '(NR>=start1 && NR<=end1) || (NR>=start2 && NR<=end2) || ...' file

就你而言:

代码语言:javascript
运行
复制
awk '(NR>=3 && NR<=6) || (NR>=18 && NR<=27) || (NR>=39 && NR<=45)' file

也就是说,对范围进行分组,当它们发生时让awk打印相应的行,只需循环一次文件。添加最后一个NR==endX {exit} (endX是最后一个范围中的结束项)也是有用的,这样它就可以在读取最后一个有趣的行后完成处理。

就你而言:

代码语言:javascript
运行
复制
awk '(NR>=3 && NR<=6) || (NR>=18 && NR<=27) || (NR>=39 && NR<=45); NR==45 {exit}' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41451662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档