我有一个差异,基本上等于额外的唯一线或在文件中移动的线,因此他们的行号已经改变.为了确定什么是真正的新增加,我运行这个小的perl片段来将“已解析”的行与“未解析的”行分开:
perl -n -e' /^\-([^\-].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDOUT "$1\n"; next; }; /^\+([^\+].*?)\([^,\d+\).*$/ && do { print STDERR "$1\n"; next; }; ' "$delta" 1>resolved 2>unresolved
事实上这很快就完成了工作,将6000行差异分成两个3000行文件,删除了对行号和统一差异装饰的任何引用.接下来是grep命令,似乎在100%cpu上运行了将近9分钟(真实):
grep -v -f resolved unresolved
这基本上是从未解析的文件中删除所有已解析的行. 9分钟后的输出恰好是9行输出 – 独特的添加或未解析的行.
首先,当我过去使用grep时,它已经相当不错了,那么为什么在这种情况下它会非常慢并且cpu很饿?
解决方法
Grep可能完全解析该文件,因为它被告知要查找的每一场比赛.您可以尝试“fgrep”(如果它存在于您的系统上)或grep -F(如果它不存在),这迫使grep使用Aho-Corasick字符串匹配算法(
http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm),该算法尝试同时匹配所有字符串,只需要一个文件的贯穿.