gpt4 book ai didi

bash - 为什么带有 -w (--word-regexp) 标志的 grep 如此缓慢且占用大量内存?

转载 作者:行者123 更新时间:2023-11-29 08:59:37 24 4
gpt4 key购买 nike

我在一个文件和一个数据文件(大小约为 3.2Gb)中有一个 ID 列表,我想提取数据文件中包含 ID 的行以及下一行。我做了以下事情:

grep -A1 -Ff file.ids file.data | grep -v "^-" > output.data

这行得通,但也提取了不需要的子字符串,例如,如果 id 是 EA4,它还会提取带有 EA40 的行。

所以我尝试使用相同的命令,但将 -w (--word-regexp) 标志添加到第一个 grep 以匹配整个词。但是,我发现我的命令现在运行了超过 1 小时(而不是大约 26 秒)并且还开始使用 10 GB 的内存,所以我不得不终止这项工作。

为什么添加 -w 会使命令变得如此缓慢并且占用内存?我怎样才能有效地运行这个命令来获得我想要的输出?谢谢

file.ids 看起来像这样:

>EA4
>EA9

file.data 看起来像这样:

>EA4 text
data
>E40 blah
more_data
>EA9 text_again
data_here

output.data 看起来像这样:

>EA4 text
data
>EA9 text_again
data_here

最佳答案

grep -F string file 只是在文件中寻找 string 的出现,但是 grep -w -F string file 必须检查string 前后的每个字符也看它们是否是单词字符。这是一个很多的额外工作,一个可能的实现是首先将行分成每个可能的非单词字符分隔的字符串,当然有重叠,这样可能会占用大量内存但是idk 这是否是导致您的内存使用的原因。

在任何情况下,grep 都不是这项工作的错误工具,因为您只想匹配输入文件中的特定字段,您应该改用 awk:

$ awk 'NR==FNR{ids[$0];next} /^>/{f=($1 in ids)} f' file.ids file.data
>EA4 text
data
>EA9 text_again
data_here

以上假定您的“数据”行不能以 > 开头。如果他们能告诉我们如何识别数据线和 ID 线。

请注意,无论 id 行之间有多少 data 行,以上内容都有效,即使是 0 或 100:

$ cat file.data
>EA4 text
>E40 blah
more_data
>EA9 text_again
data 1
data 2
data 3

$ awk 'NR==FNR{ids[$0];next} /^>/{f=($1 in ids)} f' file.ids file.data
>EA4 text
>EA9 text_again
data 1
data 2
data 3

此外,您不需要将输出通过管道传输到 grep -v:

grep -A1 -Ff file.ids file.data | grep -v "^-" > output.data

只需在一个脚本中完成所有操作:

awk 'NR==FNR{ids[$0];next} /^>/{f=($1 in ids)} f && !/^-/' file.ids file.data

关于bash - 为什么带有 -w (--word-regexp) 标志的 grep 如此缓慢且占用大量内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com