gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:32:07 25 4
gpt4 key购买 nike

有没有一种方法可以使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com