Answers:
grep
和之间有本质区别look
:
除非另有明确说明,否则grep
即使在行内的某处也会找到模式。对于手册look
页状态:
look —显示以给定字符串开头的行
我不是look
经常使用,但在我刚刚尝试过的一个简单示例中,它的效果很好。
egrep "^TEST" sortedlist.txt | wc -l
我会得到41,289个结果。但是,等效look
命令look -b TEST sortedlist.txt | wc -l
仅产生1995年的结果。我几乎想知道是否存在bug look
。
look
使用的排序规则设置与用于排序文件的程序不同。
也许有点晚答案:
Sgrep将为您提供帮助。
Sgrep(排序的grep)在排序的输入文件中搜索与搜索键匹配的行,并输出匹配的行。搜索大文件时,sgrep比传统的Unix grep快得多,但有很大的限制。
您可以在此处下载源代码:https : //sourceforge.net/projects/sgrep/? source =typ_redirect
以及此处的文档:http : //sgrep.sourceforge.net/
其它的办法:
我不知道文件有多大,也许您应该尝试并行操作:
/programming/9066609/fastest-possible-grep
我总是用大于100GB的文件来做grep,效果很好。
sudo apt-get install sgrep
要获取sgrep,buntu存储库中的sgrep实际上不是此sgrep,但我不确定这是同一件事。
您可以将文件散列为碎片,然后仅对所需的碎片进行grep:
for line in $(cat /usr/share/dict/american-english | tr '[:upper:]' '[:lower:]' | sort | uniq)
do
prefix=$(echo $line | md5sum - | cut -c 1-2)
mkdir -p $prefix
echo $line | gzip >> $prefix/subwords
done
那么查找将如下所示:
prefix=$(echo $word | md5sum - | cut -c 1-2)
zgrep -m 1 -w word $prefix/subwords
这有两件事:
sgrep可能为您工作:
sudo apt-get install sgrep
sgrep -l '"needle"' haystack.txt
项目页面http://sgrep.sourceforge.net/说:
Sgrep使用二进制搜索算法,该算法非常快,但需要排序的输入。
但是,对于插入,我认为没有比使用数据库更好的解决方案了:https : //stackoverflow.com/questions/10658380/shell-one-liner-to-add-a-line-to-a-sorted-file/ 33859372#33859372
sgrep
在Ubuntu软件仓库实际上是这个sgrep,其目的是“查找文件的结构化模式”,并已无关的二进制搜索。
如果您真的想要快速(O(1)快速),则可以构建一个要研究的哈希集。我找不到能够让我将预构建的哈希集存储在文件中并对其进行探测而无需将整个文件读入内存的实现,因此我自己开发了一个。
构建哈希集(-b
/ --build
):
./hashset.py --build string-list.txt strings.pyhashset
探查哈希集(-p
/ --probe
):
./hashset.py --probe strings.pyhashset \
'Is this string in my string list?' 'What about this one?'
…或使用字符串在标准输入上查找:
printf '%s\n' 'Is this string in my string list?' 'What about this one?' |
./hashset.py --probe strings.pyhashset
如果只对退出状态感兴趣,可以--probe
使用-q
/ --quiet
选项使输出静默:
if ./hashset.py --quiet --probe strings.pyhashset ...; then
echo 'Found'
else
echo 'Not found'
fi
有关更多选项,请参见可通过-h
/ --help
选项或随附README
文件访问的用法说明。
look
命令进行排序:LC_COLLATE = C sort -d才能使命令正确运行,因为外观似乎忽略了语言环境,并且仅使用C进行了硬编码排序,因此我也打开了一个错误由于存在这种令人困惑的行为:bugzilla.kernel.org/show_bug.cgi?