cmo*_*cmo 9 unix scripting grep large-files
grep -F -f file1 file2
Run Code Online (Sandbox Code Playgroud)
file1是90 Mb(250万行,每行一个字)
file2是45 Gb
无论我让它运行多久,该命令实际上都不会产生任何结果.显然,这超出了grep的范围.
似乎grep无法处理来自该-f选项的那么多查询.但是,以下命令确实产生了所需的结果:
head file1 > file3
grep -F -f file3 file2
Run Code Online (Sandbox Code Playgroud)
考虑到文件大小,我怀疑sed或awk是否也是合适的替代方案.
我不知道其他选择......请帮忙.学习一些sql命令是否值得?这简单吗?谁能指出我正确的方向?
小智 14
尝试使用LC_ALL = C. 它将搜索模式从UTF-8转换为ASCII,速度提高了原始速度的140倍.我有一个26G的文件,这需要我大约12个小时才能完成几分钟.来源:以任何方式加大一个巨大的文件(80GB)来加速它?
所以我做的是:
LC_ALL=C fgrep "pattern" <input >output
Run Code Online (Sandbox Code Playgroud)
我不认为有一个简单的解决方案.
想象一下,你编写自己的程序,你做了你想要的,你最终将得到一个嵌套循环,其中外部循环遍历file2中的行,内部循环遍历file1(反之亦然).迭代次数随之增长size(file1) * size(file2).当两个文件都很大时,这将是一个非常大的数字.使用一个较小的文件head显然可以解决这个问题,但代价是不再给出正确的结果.
一种可能的出路是索引(或排序)其中一个文件.如果你遍历file2并且对于每个单词你可以确定它是否在模式文件中而不必完全遍历模式文件,那么你会好得多.这假设您进行逐字比较.如果模式文件不仅包含完整的单词,还包含子字符串,那么这将不起作用,因为对于file2中的给定单词,您将不知道在file1中要查找的内容.
学习SQL当然是个好主意,因为学习一些东西总是好的.它将会解决您的问题,因为SQL会受到上述相同的二次效应的影响.如果索引适用于您的问题,它可以简化索引.
你最好的选择可能是退后一步并重新思考你的问题.