regex - 使用ack或awk或比grep更好的方法从另一个文件中获取模式?

标签 regex perl awk grep ack

有没有一种方法可以使用ack作为-f中的grep选项从另一个文件中的一个文件(模式列表)中获取模式?我看到-f中有一个ack选项,但它与-f中的grep不同。

也许举个例子会给你一个更好的主意。假设我有file1:

file1:
a
c
e

和file2:
file2:
a  1
b  2
c  3
d  4
e  5

我想从file2获取file1中的所有模式以给出:
a  1
c  3
e  5
ack可以这样做吗?否则,是否有更好的方法来处理这项工作(例如awk或使用哈希),因为我在两个文件中都有数百万条记录,并且确实需要一种有效的方法来完成?谢谢!

最佳答案

这是一个Perl内联代码,它使用散列来保存来自file1的有用键集,以进行遍历file2的每次迭代的O(1)(摊销时间)查找。因此它将在O(m + n)时间中运行,其中m是 key 集中的行数,而n是要测试的文件中的行数。
perl -ne'BEGIN{open K,shift@ARGV;chomp(@a=<K>);@hash{@a}=()}m/^(\p{alpha}+)\s/&&exists$hash{$1}&&print' tkeys file2
在对文件2逐行测试 key 时, key 集将保留在内存中。

这与使用Perl的-a命令行选项相同:
perl -ane'BEGIN{open G,shift@ARGV;chomp(@a=<G>);@h{@a}=();}exists$h{$F[0]}&&print' tkeys file2
第二个版本在眼睛上可能会更容易一些。 ;)

您在这里必须记住的一件事是,您受IO约束的可能性要比处理器约束的可能性大。因此,目标应该是最大程度地减少IO的使用。当整个查找关键字集保留在提供O(1)摊销式查找的哈希中。该解决方案相对于其他解决方案可能具有的优势是,对于文件2的每一行,某些(较慢的)解决方案将不得不遍历您的 key 文件(文件1)。这种解决方案将是O(m * n),其中m是 key 文件的大小,n是file2的大小。另一方面,此哈希方法提供O(m + n)时间。那是一个很大的差异。它消除了对键集的线性搜索,从而受益匪浅,而仅通过IO一次读取键就进一步受益。

关于regex - 使用ack或awk或比grep更好的方法从另一个文件中获取模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9936962/

相关文章:

python - 在 Python 中搜索两个复杂的正则表达式模式之一而不创建子匹配

javascript - 如何使用 Javascript 正则表达式检测没有评论和 Markdown 的句子?

html - 你如何在 Perl 中处理格式错误的 HTML?

mysql - Bugzilla 中分离客户端的基本权限

bash - 如何在每一行前添加一个用 awk 找到的模式实例

ruby - 使用 Regexp 在 Ruby 中匹配模式

regex - 正则表达式验证全名与括号中的电子邮件(需要括号)

linux - 运行 Matlab 代码失败时如何使 Perl 脚本停止?

file - 打印文件的所有行以及其他文件中的匹配行

linux - 使用awk混合两个文件