如何快速搜索大字符串中的子字符串和周围的字符?

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 的解决方案:

请注意,这里的-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 中的子字符串?

相似子串快速搜索

如何在 C# 中搜索字符串数组中的子字符串

如何使用 PHP 中的正则表达式在字符串中搜索可以按任何顺序排列的子字符串

如何将大字符串中的子字符串与正则表达式匹配? [复制]

python 的运行时 if 字符串中的子字符串