【发布时间】:2013-03-20 05:06:46
【问题描述】:
如果 grep 从查找文件的长行中的模式文件中找到一个短模式,我需要一个工具来提取可以在较长模式中找到的查找文件的短行。
换句话说,给定莎士比亚的作品,每行一个句子,说一本法语词典,我想找出在莎士比亚的哪一行中找到了哪些法语单词,从而可以检测到莎士比亚的一行可能包含多个法语单词,并且一个法语单词可能出现在不止一行的莎士比亚。
例如:
pattern_file={
"The sun is shining!"
"It is a beautiful day!"}
lookup_file={
"Rain"
"Sun"
"Cloud"
"Beautiful"
"Shining"}
我想要的是
function file pattern
给出在较长模式中找到的行和较长模式本身以逗号分隔,并检测到多个匹配项。
ideal_result_file={
"Sun","The sun is shining!"
"Beautiful","It is a beautiful day!",
"Shining", "The sun is shining!"}
目前,我使用 grep 逐行遍历整个查找文件:
while read line
do
grep -is $line pattern_file | sed 's/^/'"$line"'\,/g' >> result_file.csv
done < lookup_file
这太慢了!我的 lookup_file 包含超过 50 000 行,而我的 pattern_file 包含 500 行。使用 grep 在我的 lookup_file 中查找更短的模式需要几秒钟,而使用我的循环方法的单次传递需要几天/几周。
我们将不胜感激任何语言的解决方案。
有点相关
Very slow loop using grep or fgrep on large datasets
Is Perl faster than bash?
解决方案需要与 GB 大小的循环和模式文件兼容。
【问题讨论】:
-
lookup_file 是由纯文本组成,还是有正则表达式?
-
lookup_file 是纯文本
-
这个while循环可以向量化吗?或者翻译成另一种更有效的(编译)语言?
-
我认为没有任何编译语言会比
grep更高效。无论如何,在 2000 字的文本文件上使用grep -F -f /usr/share/dict/words(99000 字)在不到一秒的时间内运行,尽管它只产生最长的匹配(例如,anything将产生匹配anything而不是 @ 987654331@)。您希望输出显示所有匹配项吗? -
是的,所有匹配项都是必需的。如果我可以在这里单独使用 grep,没有什么比 grep 更快的了,但也许使用 grep 的循环方法在另一种语言中会更快?
标签: bash search while-loop grep pattern-matching