这里有两个大文本文件,30mb
每个文件都需要grep
一个,如grep -f "file01.txt" "file02.txt" > file03.txt
.
这样做会返回“内存耗尽”错误。
如何不考虑字母顺序来比较这些文件?
答案1
除非您file01.txt
包含实际的常用表达, 尝试:
grep -Ff "file01.txt" "file02.txt" > file03.txt
-F
告诉grep
将其file01.txt
视为固定字符串,而不是正则表达式。这将大大提高速度并大大减少内存需求。
常用表达
或者,如果您file01.txt
确实包含正则表达式,您可以将其分成几个部分并grep
分别应用于每个部分:
split -dn 10 "file01.txt" ./tmp-file01.
for f in ./tmp-file01.*; do grep -f "$f" "file02.txt"; done >file03.txt
以上分为file01.txt
10部分。根据您的可用内存,您可能需要更多内存。
如果 file01.txt 是不是有正则表达式,然后-F
在第二行使用:
for f in ./tmp-file01.*; do grep -Ff "$f" "file02.txt"; done >file03.txt
答案2
你不能 - 模式必须加载到grep
这个耗尽的内存中。
但如果你想比较文件,为什么不直接使用diff
(对内容进行排序后)?
对于每个模式一行(如 MD5 列表):
while read md5; do
grep -w "$md5" file02.txt
done < file01.txt > file03.txt
这当然要慢得多,特别是对于大 file02.txt(当它不适合缓存时),但适用于模式 file01.txt 的每种大小。