zgrep首先匹配文件中的每一行

时间:2016-05-25 14:27:09

标签: grep

我正在尝试使用zgrep -f为查询文件的每一行查找单个待搜索文件中的第一个匹配项。因为要搜索的文件很大(~3GB),所以,如果zgrep找到当前查询行的一个匹配项,它将停止该搜索,然后在查询文件的下一行搜索该模式,这一点至关重要。我的问题是“zgrep -m 1 -f”只会找到查询文件第一个查询行的第一个匹配项;然后它完全停止读取查询文件。是否有其他方法可以组合使用-m和-f(z)grep选项来更有效地执行此搜索?

以下是我的1000行查询文件结构(wordList.txt)中的两行:

^dog 
^cat 

来自我的300万行(?)待搜索文件中的三行(GoogleNews-vectors-negative300.txt.gz)

dog 0.017198 -0.007493 -0.057982 0.054051 -0.028336
accordion 0.012590 -0.003692 -0.014291 0.057166 -0.025180
cat 0.004059 0.067190 -0.093874 0.071370 0.038900

不幸的是这个命令:

% zgrep -m 1 -f wordList.txt GoogleNews-vectors-negative300.txt.gz > myVectors.txt

仅返回第一个查询的第一个匹配项:

dog 0.017198 -0.007493 -0.057982 0.054051 -0.028336

而这个命令(没有“-m 1”):

% zgrep -f wordList.txt GoogleNews-vectors-negative300.txt.gz > myVectors.txt

返回完整的预期输出,但需要更长的时间,因为它每次都会搜索整个文件:

dog 0.017198 -0.007493 -0.057982 0.054051 -0.028336
cat 0.004059 0.067190 -0.093874 0.071370 0.038900

1 个答案:

答案 0 :(得分:3)

更新:我最后编写了一个小的bash脚本作为单查询“zgrep -m 1”的包装器,因此我将其粘贴到下面以防其他人遇到类似的问题。添加短路能力加快了我的搜索速度〜95%:

#!/bin/sh
for L in `cat wordList.txt`; do
    zgrep -m 1 "$L " GoogleNews-vectors-negative300.txt.gz >> myVectors.txt
done