如何快速搜索大字符串中的子字符串和周围的字符?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速搜索大字符串中的子字符串和周围的字符?相关的知识,希望对你有一定的参考价值。
我有一个文件,需要在每个子字符串实例之前和之后找到10个字符。
例如,来自:
(1M characters)...ldkS9jfasdfalkasjFalskdfjsDljBASHcslakfjsalZkf4djfsa3Jkjl...(1M characters)
我想要输出:
lskdfjsDljBASHcslakfjsal
当然,在文件中,有很多字符串实例,我想以具有前10个字符和后10个字符的相同方式返回所有这些实例。
现在我正在按如下方式使用grep
:
grep -o -P '.{0,10}BASH.{0,10}' input.txt > output.txt
虽然这有效,但似乎很慢。有什么办法可以加快这个过程?预先感谢。
您可以尝试以下操作:
grep -F 'BASH' input.txt | grep -o -E '.{10}BASH.{10}'
级联多个grep
通常看起来像是反模式,这是由于设计不良的搜索模式。在这种情况下,其工作方式如下:第一grep
有效地缩小-F
(固定)选项中包含目标词的行;然后第二个grep
会提取单词周围的子字符串。
我已经生成了一个随机字符为100,000列的文本文件和10,000行(1 GB)。这是基准结果,旧的赛扬CPU:
time grep -o -P '.{0,10}BASH.{0,10}' input.txt
=> 2m48s
time grep -F 'BASH' input.txt | grep -o -E '.{10}BASH.{10}'
=> 0m20s
顺便说一句,令人惊讶的是,我在随机产生的ascii文件。
[编辑]
如果您需要保持重复的比赛,请尝试:
BASH
与上述答案相比,它不需要额外的执行时间。
我有一个文件,需要在每个子字符串实例之前和之后找到10个字符。
从字面上解释,这意味着grep -F 'BASH' file | perl -ne 'while (/(?=(.{10}BASH.{10}))/g) {print $1, "
"}'
的简单使用通常不能满足要求,因为此选项仅报告非重叠序列。
[为了说明,为简单起见,假设感兴趣的子字符串为“ X”,并且任一侧的窗口长度必须为3。
然后给定字符串“ aaaXaaXaaa”,输出(根据需求语句)必须为两行:
grep -o
这是一个脚本,它说明了使用aaaXaaX
XaaXaaa
的解决方案:
jq
请注意,这里的-s选项实际上使控制字符(例如换行符)被视为单个字符。
输出
#!/bin/bash
for x in X aXa aaaXaaa aaaXaaXaaa aaaXXaaa
do
echo $x ::
jq -Rrs --arg ss X --argjson n 3 '
. as $in
| indices($ss)[] as $i
| select($i-$n >=0 and $i+$n <= length)
| $in[$i-$n:$i+$n+1]' <<< "$x"
echo
done
以上是关于如何快速搜索大字符串中的子字符串和周围的字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中搜索 std::string 中的子字符串?