为什么 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) 标志占用大量内存? 的相关文章

  • 管道安装时疏水阀是否按预期工作?

    以下是问题演示的最少代码 http pastebin com 5TXDpSh5 http pastebin com 5TXDpSh5 bin bash set e set o pipefail function echoTraps echo
  • rsync :递归同步所有文件,同时忽略目录结构

    我正在尝试创建一个 bash 脚本 用于将音乐从桌面同步到移动设备 桌面是源 有没有办法让rsync递归同步文件但忽略目录结构 如果从桌面删除了文件 我希望它也在设备上删除 我的桌面上的目录结构是这样的 Artist1 Artist1 ar
  • bash 递归xtrace

    有没有办法运行 bash 脚本 X 以便如果 X 调用可执行 bash 脚本 Y 则 Y 以 sh eux 开头 X sh Y sh Y sh bin sh echo OK 可以通过导出子 shell 使用父 shell 中设置的相同 sh
  • C shell 脚本中是否有短路逻辑运算符?

    我认为 C shell 脚本的行为会像 C 一样 并对逻辑运算符使用短路求值 if e cache find monitor newer cache then endif 但在 if 语句中 即使第一个条件为真 也会检查第二个条件 从而给出
  • 如何创建路径别名?

    那么 cs 将映射到 College 以便我可以运行命令 cd cs 我相信您在问如何创建符号链接 或符号链接 例如 ln s College cs 不过 还有其他方法可以加快工作流程 例如设置 CDPATH export CDPATH C
  • 如何按文件大小对查找结果进行排序

    如何按文件大小对 find 命令的结果进行排序 我试图对这个 find 命令的结果进行排序 find src type f print0 我不需要目录的大小 我需要仅按大小排序的文件相对路径 这是如何做的using find command
  • PDF:在现有 PDF 文件中插入一行文本

    我有一个 PDF 文件 我希望在所有页面 前两页除外 的页脚上添加一行纯文本 不是徽标或类似内容 有谁有一个如何做到这一点的例子 用任何语言 Update 原始 PDF 是用 Scribus 制作的 我可以完全控制它 因此 如果更容易进行查
  • '>&0' 有用途吗(重定向到标准输入)?

    在 bash 中你可以这样做 echo test gt 1 重定向到标准输出 尽管它已经到那里了 echo test gt 2 重定向到标准错误 echo test gt 0 重定向到标准输入 当我做最后一个时 我的终端仍然打印test就像
  • 无法让 ASCII 艺术回显到控制台

    我是 Bash 脚本新手 这让我感到困惑 我正在将 ASCII 艺术添加到项目中 但似乎无法弄清楚如何转义某些字符 有人可以帮我让下面的代码正常工作吗 每当我尝试添加斜杠作为转义字符来修复错误时 斜杠也会在执行时打印到控制台 这破坏了形象
  • cat/Xargs/命令 VS for/bash/命令

    Linux 101 Hacks 一书的第 38 页建议 cat url list txt xargs wget c 我通常这样做 for i in cat url list txt do wget c i done 除了长度之外 还有什么东
  • 零垫重命名,例如图片 (2).jpg -> 图片 (002).jpg

    我需要按照标题在所有子文件夹中解释的方式重命名所有图像 我正在考虑用正则表达式提取括号内的数字 然后重命名它 搜索周围我看到有类似的工具rename and mmv但我无法让他们重新命名 jpg 我将不胜感激任何解决我的问题的建议 顺便说一
  • virtualenvwrapper 函数在 shell 脚本中不可用

    所以 我再一次制作了一个很棒的 python 程序 它让我的生活变得更加轻松 并节省了大量时间 当然 这涉及到一个 virtualenv 用mkvirtualenvvirtualenvwrapper 的功能 该项目有一个requiremen
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC
  • git 可以知道你当前的分支是从哪个分支分支出来的吗?

    我想创建一个 git 别名 让我可以从其分支的原始分支同步我的分支 例如 如果我从
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 使用 BHO 扩展 Windows 资源管理器

    我正在尝试使用 C 中的自定义面板来扩展 Windows 资源管理器 不是谎言 它应该如下所示 这是我发现的一个类似的问题 在 C 中 类似问题 https stackoverflow com questions 22101829 ishe
  • OS X - 输入“grails”命令后终端重置

    在我的 bash profile 中 我有以下几行 export GRAILS HOME usr share java grails export PATH PATH GRAILS HOME bin GRAILS HOME 是同一目录中 g
  • 使用 adb 从手机摄像头传输照片的脚本

    Story 我用手机摄像头拍照和录制视频 并将它们全部保存在我的内部存储 SD 卡上 我定期将它们备份到我的电脑上 因此我将这些相机照片保存在电脑存储中与手机存储同步 多年来 我一直通过以下方式将手机相机照片备份到电脑上 将手机插入电脑并允
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 将 cron 作业配置为在 Jenkins 上每 15 分钟运行一次

    如何在 Jenkins 上每 15 分钟运行一次 cron 作业 这是我尝试过的 在 Jenkins 上 我使用以下 cron 语法设置了每 15 分钟运行一次的作业 14 但该作业每小时执行一次 而不是 15 分钟 我收到有关 cron

随机推荐

  • 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 这