为什么 grep 如此慢并且使用 -w (--word-regexp) 标志占用大量内存?

2024-01-08

我在一个文件和一个数据文件(大小约为 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也可以看看它们是否是单词字符。那是一个lot额外的工作和一个可能的实现是首先将行分成每个可能的非单词字符分隔的字符串,当然会有重叠,这样可能会占用大量内存,但不知道这是否是导致内存使用的原因。

无论如何,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 线。

请注意,无论有多少个,上面的方法都会起作用data你之间的线id行,即使有 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 grep 如此慢并且使用 -w (--word-regexp) 标志占用大量内存? 的相关文章

  • 为什么这个符号链接创建了两个实例

    我有一个用于我的点文件的安装脚本 我用来创建一个目录到我的主文件夹的符号链接 这些链接执行得很好 但创建了第二个符号链接 我无法解释为什么 项目中的文件夹结构如下所示 install sh scripts shell sh shell in
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 使用 xlib 在屏幕顶部绘图

    我想在屏幕上的所有窗口顶部绘制一些图元 我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib from Xlib display import Display from Xlib import X from Xlib
  • Grep 批量 ping

    寻找一种更好的方法来做到这一点 而不是我习惯的 手动 方法 因为这是一个我必须定期经历的过程 我有一系列要 ping 的 IP 从10 0 1 15 to 10 0 50 15 第三个八位位组指的是物理位置 最后一个八位位组指的是该位置处的
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • Windows 10 上的 LibPNG 构建问题

    我试图在 Windows 10 上构建 libpng 以获取 win32 二进制文件 但我认为有一个与 awk 解析带有 CRLF 行结尾的文件相关的问题 我尝试使用 dos2unix 命令转换文件 但没有成功 结果相同 在 make 命令
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 每次重新运行终端时,我都必须输入 export PATH=~/anaconda/bin:"$PATH"

    我已经安装了 Anaconda for Mac 但出现了一些问题 当我输入命令时which conda or which ipython I get conda not found and ipython not find 然后我找到这个命
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 如何捕获 X 错误?

    我尝试在网上搜索 但我必须注意 找到有关 X 编程这方面的材料并不容易 我使用 X 和 GLX 来创建 OpenGL 上下文 我已经知道我当前的显卡驱动程序仅支持 OpenGL API 版本 3 3 但我希望我的应用程序能够尝试创建任何类型
  • execv() 和 const 性

    我经常使用execv 函数在 C 中 但如果某些参数在 C 字符串中 则令我烦恼的是我无法执行此操作 const char args 4 args 0 usr bin whatever args 1 filename c str args
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如
  • 从 bash 变量中删除空格

    假设一个变量包含空格 换行符和制表符 后跟一些文本 为什么会这样 var var space strip var of everything but whitespace then remove what s left i e the wh
  • 使用.sh脚本设置环境变量

    如何编写 sh 脚本以在 Ubuntu 14 上全局设置环境变量 i e bin sh sets this in to master etc environment export DB HOST 123 我知道我可以运行这个脚本 它只会将其
  • 如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件 我想到的第一个解决方案是使用find管道与xargs grep find iname py xargs grep e YOUR PATTERN 但是 如果我需要查找跨越多行的模式 我就会陷入困境 因为
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • 防止 rsync 删除与给定模式匹配的目标文件

    我正在使用 rsync 将文件从源同步到目标 rsync av delete source destination 我在目标端有一个目录 而不是在源端 我想阻止 rsync 删除此目录 是否有一个选项可以传递给 rsync 以防止该目录在同
  • 合并两个非常大的文件,忽略第一句

    我想将两个巨大的文件 每个几百兆字节 合并成一个文件 同时忽略第一行 我想使用 awk 因为我认为它应该是最优化的方式 我这样做的方式只忽略第二个文件的第一行 知道如何做工作或者是否有更快的方法 awk FNR NR FNR 1 next
  • 如何找到进程启动时使用的原始用户名?

    有一个 perl 脚本需要以 root 身份运行 但我们必须确保运行该脚本的用户最初没有以用户 foo 身份登录 因为它将在脚本运行期间被删除 那么 我如何查明自登录以来可能已多次起诉的用户是否在该链中的任何时间都没有模拟过 foo 我发现

随机推荐

  • Chrome 开发者扩展中的 CORS 问题

    我是 Chrome 扩展开发的新手 我正在开发一个 Chrome开发商扩展 作为开发人员工具的一部分出现 此要求是进行外部服务 某些 URL 调用 该调用可能位于也可能不在同一服务器 原始服务器 中 从文档中我看到扩展不受同源策略的限制 h
  • 字符串有多少个参数

    在C 中使用String Format格式化字符串之前 我想知道该字符串接受多少个参数 例如 如果字符串是 0 与 1 不同 我想知道该字符串接受两个参数 例如 如果字符串为 0 与 1 和 2 不同 则该字符串接受 3 个参数 我怎样才能
  • SQL Server Compact 文件在哪里?

    我有一个使用 SQL Server Compact 数据库的 ASP NET MVC 项目 我有以下连接字符串FoobarContext
  • PHP str_replace 无法正常工作

    我正在使用 str replace 但它无法正常工作 我有一个文本区域 其输入通过表单发送 当服务器接收到数据时 我想将新行更改为 teams GET teams teams str replace n teams echo teams 奇
  • 如何对 Firebase.functions().httpsCallable 执行 GET?

    如何对 Firebase functions httpsCallable 执行 GET 我不断收到 POST 错误 404 但这是对我的服务器的 GET 请求 我应该不传递任何内容 还是需要更改此 httpsCallable 来获取函数 C
  • 您的语言在实践中对 unicode 的支持程度如何?

    我正在研究新的语言 有点渴望一种我不再需要担心字符集问题以及我在新项目中使用 PHP 遇到的大量其他问题的语言 我倾向于认为 Java 过于冗长和混乱 而且我不想用 6 英尺长的杆子接触 Windows 因此倾向于排除 Net 这就剩下了基
  • 如何在 SASS 中使用父选择器将类链接到元素[重复]

    这个问题在这里已经有答案了 我正在尝试使用 SASS scss 执行以下操作 class Base class styles a Additions for when applied to a link 但我收到编译器错误 Invalid
  • Flutter windows:获取flutter应用程序的win32窗口句柄

    如果我没记错的话 flutter 目前是使用 win32 库在 Windows 上实现的 尽管一些文档页面指出这可能会更改为 NET 或其他一些框架 因为 flutter windows 处于非常早期的开发阶段 并且可能随时更改 时间而不保
  • 如何在hive中添加jar文件

    我正在尝试使用 hive contrib 0 10 0 jar 在 hive 中添加添加 JAR hive contrib 0 10 0 jar命令但它总是说 hive contrib 0 10 0 jar 不存在 我现在使用的是 HDP
  • vim:更改默认粘贴寄存器

    当我在 vim 中拉取或删除文本并运行时 reg 我看到它要进去注册 但是当我粘贴时 我看到 E353 寄存器中没有内容 我从中得到的是 vim 正在拉动 但粘贴自 set clipboard clipboard echo version
  • 带进度对话框的 Android 下载管理器

    我已经使用 Android 下载管理器编写了一个 Android 应用程序 并且尝试使用下面的代码显示下载进度 myTimer schedule new TimerTask public void run try DownloadManag
  • 如果字段是实例成员,则回调处理程序会出现异常

    希望有人帮助我解决这个问题 If CallbackHandler proxy是静态的 那么一切正常 using System using System ServiceModel namespace ConsoleApplication5 D
  • Boost heap 设置用户定义的比较函数

    最近 我发现 Boost Heap 在我的项目中非常有用 但我找不到任何示例代码来显示如何设置任意比较函数 include boost heap fibonacci heap hpp using boost heap fibonacci h
  • 如何使用 SOA 架构实现松耦合

    我最近做了很多关于 SOA 和 ESB 等的研究 我现在正在工作中重新设计一些遗留系统 并希望使用比目前更多的 SOA 架构来构建它 我们在大约 5 个网站中使用这些服务 而我们的遗留系统目前面临的最大问题之一是 几乎每次我们进行错误修复或
  • 如何在具有相同端口但具有不同主机头的 IIS 服务器中托管多个站点并公开访问它

    我正在尝试在 IIS 服务器中托管多个网站 我可以使用不同的端口托管它 但我不想为不同的网站使用不同的端口 我也尝试使用主机标头 但我只能在本地访问这些标头 我想公开 外部访问这些标头 我怎样才能做到这一点 我还配置了 DNS 但我无法公开
  • 如何在 ASP.NET Web 应用程序中打开 SectionGroup?

    我有一个小型 ASP NET Web 应用程序托管在集成测试中 在 NUnit 中执行 我的产品代码通常可以从 web config 或 app config 文件中找到配置数据 但由于某种原因 在托管 ASP NET 时 我似乎得到了一个
  • flex-box:先收缩再包裹

    我有一个包含多个列的布局 其中一些是固定的 另一些则根据需要进行拉伸 因此 我使用弹性盒 此外 我想要并且需要使用 flex wrap 结构是这样的 div class row style display flex div class co
  • Xcode 7.3 缺少私有框架

    我最近将 Xcode 升级到了 7 3 版本 当我编译现有项目时 我收到此错误消息 directory not found for option F Applications Xcode app Contents Developer Pla
  • 基于类的视图“没有属性.as_view()”错误

    我正在跟进本教程 http code tutsplus com tutorials beginners guide to the django rest framework cms 19786 尝试为我的API制作一个Products ta
  • 为什么 grep 如此慢并且使用 -w (--word-regexp) 标志占用大量内存?

    我在一个文件和一个数据文件 大小约为 3 2Gb 中有一个 id 列表 我想提取数据文件中包含 id 的行以及下一行 我做了以下事情 grep A1 Ff file ids file data grep v gt output data 这