目前,我正在从包含以下任意内容的文件中提取数据:
342163477\|405760044\|149007683\|322391022\|77409125\|195978682\|358463993\|397650460\|171780277\|336063797\|397650502\|357636118\|168490006...............
该列表较长,包含约 700 个不同的值。
最有效的提取方法是什么?我可以把它分成10/20/50/100的部分...或者还有其他unix方法吗?这个 grep 通过管道传输到 python 进行进一步分析,速度足够快。
答案1
将所有这些数字放在一个文件中,每个数字占一行,然后使用grep
with-f
或--file=
switch:
grep -f filewithcodestosearchfor filetosearchin
答案2
您尝试过使用--mmap
标志吗?
来自男人:
--mmap If possible, use the mmap(2) system call to read input, instead of the default read(2) system call. In some situations, --mmap yields better performance. However, --mmap can cause undefined behavior (including core dumps) if an input file shrinks while grep is operating, or if an I/O error occurs.
答案3
无需将它们放入文件中,您可以执行以下操作:
grep -F '342163477
405760044
149007683
322391022
77409125
195978682
358463993
397650460
171780277
336063797
397650502
357636118
168490006' file
同样,这也是可移植/标准的(因为在BRE中使用grep -Ff
,是\|
grep
不是标准/便携式)。
另外,真正的问题是什么?您是否想获取包含这些数字的行或知道哪些数字出现在文件中?文件排序了吗?文件中每一行有一个数字吗?...
答案4
正如 poige 在对另一个答案的评论中提到的那样,如果可以的话,请使用grep -F
/ 。fgrep
这会将任何正则表达式字符视为文字。您仍然可以通过将其与该选项结合起来获得交替的效果-f file
,并将您的模式放入文件中,一个模式到一行。
如果您需要模式包含正则表达式,请尝试将自己限制为经典 ERE 语法,并使用grep -E
/ egrep
。经典 ERE 语法不包括反向引用,因此没有以下形式的模式...(pat)...\1...
:这可能会使用 DFA 来执行匹配,并且效率更高。但这取决于您的egrep 实现。关于这一点的更多讨论是这里。请注意,一些egrep 实现(例如Gnu 的实现)将接受带有反向引用的模式;但当匹配这些模式时,这里提到的效率优势肯定不会出现。
我提到egrep
优化是为了理论上的兴趣,因为值得测试一下它是否有助于您的预期用途。我猜想,正如 manatwork 所说,Gnu 的 grep 引擎比你更擅长找出如何优化。