【发布时间】:2015-01-02 04:24:56
【问题描述】:
我有一个差异,它基本上等同于额外的唯一行或文件中移动的行,因此它们的行号已经改变。为了确定什么是真正的新增内容,我运行了这个小 perl sn-p 以将“已解决”行与“未解决”行分开:
perl -n -e'
/^\-([^\-].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDOUT "$1\n"; next; };
/^\+([^\+].*?)\([^,\(]+,\d+,\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 正在解析一个文件的 3000 行,可能会解析 3000 次,因此可能相当于解析一个 9,000,000 行的文件。但这仍然不是那么大。这几乎就像 grep 需要 60 秒来解析 1,000,000 行。
-
注意
.*$没用 -
当然,但我只是想 ^ 如果没有 $ 可能会有点寂寞。 :-)
-
我认为使用 Regexp::Assemble 构建单个正则表达式而不是大量使用它们会带来好处。