- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将处理文本文件 (>300 GB) 并将其拆分为小文本文件 (~1 GB)。我想加快 grep/awk 命令的速度。
我需要对 b 列有值的行进行 grep,这是我的方法:
# method 1:
awk -F',' '$2 ~ /a/ { print }' input
# method 2:
grep -e ".a" < inpuy
这两种方式每个文件都花费 1 分钟。那么我怎样才能加快这个操作呢?
输入文件示例:
a,b,c,d
1,4a337485,2,54
4,2a4645647,4,56
6,5a3489556,3,22
9,,3,12
10,0,34,45
24,4a83944,3,22
45,,435,34
预期输出文件:
a,b,c,d
1,4a337485,2,54
4,2a4645647,4,56
6,5a3489556,3,22
24,4a83944,3,22
最佳答案
How to speed up grep/awk command?
您确定 grep
或 awk
是造成您感知缓慢的罪魁祸首吗?你知道cut(1)吗或 sed(1) ?您是否对运行时间进行了基准测试wc(1)在你的数据上?可能文本 I/O 花费了很多时间。
请进行基准测试几次,并使用time(1)对您的程序进行基准测试。
我有一台高端 Debian 台式机(配备 AMD 2970WX、64Gb RAM、1TB SSD 系统磁盘、多 TB 7200RPM SATA 数据磁盘)并且只是在 25GB 文件上运行 wc
(一些*.tar.xz
存档)在硬盘上需要 10 多分钟(用 time
测量),而 wc
正在做一些 < em>非常简单的文本处理,按顺序读取该文件,因此运行速度应该比grep
(但令我惊讶的是,事实并非如此!)或 awk
在相同 数据上:
wc /big/basile/backup.tar.xz 640.14s user 4.58s system 99% cpu 10:49.92 total
和(在同一个文件上使用grep
来计算a
的出现次数)
grep -c a /big/basile/backup.tar.xz 38.30s user 7.60s system 33% cpu 2:17.06 total
只需巧妙地(使用高效的O(log n) time complexity data structures : red-black trees 或 hash tables , 等等 ...) C 或 C++ 或 Ocaml 或大多数其他好的语言和实现中的等效程序。或者购买更多 RAM 来增加您的 page cache .或者买一个SSD保存您的数据。并且多次重复您的基准测试(因为页面缓存)。
很可能使用 300Gb 的纯文本文件不是最好的方法。 拥有巨大的文本文件通常是错误的,而且一旦您需要多次处理相同的数据,就很可能是错误的。你会更好pre-process不知何故..
如果您多次对相同数据文件重复相同 grep
搜索或awk
执行, 考虑改用 sqlite (参见也 this 答案)甚至一些other真实relational database (例如使用 PostGreSQL 或其他一些好的 RDBMS)来存储然后处理您的原始数据。
所以一种可能的方法(如果你有足够的磁盘空间)可能是编写一些程序(用 C、Python、Ocaml 等...),由你的原始数据提供,并填充一些 sqlite
数据库。一定要有巧database indexes并花时间设计足够好的database schema ,意识到database normalization .
关于linux - 如何加速 grep/awk 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56334265/
我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace , debug , info , warning和 error . 显然trace级别消息只是高速发送垃圾邮
我正在经历一些事情,发现了我无法理解的事情, grep -v grep 这意味着什么?我知道 -v 开关将选择所有不匹配的行。但为什么是第二个grep? 这是完整的命令: ps -ef | grep
我使用 egrep 输出一些带有平台名称的行: XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu
grep退出状态部分报告中的手册: EXIT STATUS The exit status is 0 if selected lines are found, and 1 if not
我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。 ADWN 1259 11:00 B23 ADWN 3009
我猜它不是 Perl 兼容的正则表达式,因为有一种特殊的 grep具体来说就是 PCRE。什么是grep最相似? grep有什么特别的怪癖吗?我需要知道什么? (我习惯了 Perl 和 PHP 中的
有没有办法让 grep 从与搜索表达式匹配的文件中输出“单词”? 如果我想在多个文件中查找“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我写的); some-t
我有许多(近 100 个)大 csv 文件,第一列中有 sellID。我知道某些 sellID 在 2 个或更多文件中重复 2 次或多次。是否可以使用 grep 找到所有重复的 sellID(创建映射
我有一个文件中的文件列表。该列表很大,并且文件名是非标准的:这意味着有些文件包含空格、非 ASCII 字符、引号、单引号... 因此,将庞大的文件列表作为参数传递给 grep 并不是一种选择: 因为我
我想在 shell 脚本中使用 grep 和两个变量 var = match cat list.txt | while read word_from_list; do grep "$word_
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
当我执行以下 grep 时,我得到的结果我无法向自己解释: host:/usr/local/tomcat > grep '-XX:PermSize=256m' * RELEASE-NOTES:
这个问题在这里已经有了答案: grep recursively for a specific file type on Linux (5 个回答) 关闭4年前。 要在子目录中查找所有带有 .out 扩
有什么方法可以让我在搜索某些东西时使用 grep 忽略某些文件,相当于 svnignore 或 gitignore 的东西?我通常在搜索源代码时使用类似的东西。 grep -r something *
有没有办法让 grep 从匹配搜索表达式的文件中输出“单词”? 如果我想在多个文件中找到“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我的); some-tex
我是 awk/sed 的完全菜鸟,所以如果我在这里遗漏了一些明显的东西,请原谅我。 基本上我正在尝试做一个嵌套的 grep,即类似于: grep $value `exim -Mvh $(`exim -
我正在尝试编写下载 node.js source 的脚本和 corresponding SHASUMS256.txt ,校验和,grep OK,不返回任何结果,使用 grep 的 -q 标志成功退出代
在 grep "str"* 这是否意味着 grep 执行 grep 的所有内容? 那么 grep -r "str". 的结果比前一个多 最佳答案 当您运行 grep str * 时,shell 将扩展
我正在尝试 grep 文件以查找匹配项的确切出现,但我也得到了更长的虚假匹配项: grep CAT1717O99 myfile.txt -F -w 输出: CAT1717O99 CAT1717O99
我有一个文件,其中包含我希望通过未指定分析运行的标识符(每行一个)。如果一切运行正常,分析将输出具有相同标识符的另一个列表(不一定按相同顺序)。 然而,事实证明,对某些输入标识符没有进行分析,并且这些
我是一名优秀的程序员,十分优秀!