【发布时间】:2019-05-28 02:22:36
【问题描述】:
我将处理文本文件 (>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
【问题讨论】:
-
其他列可以为空吗?如果不是,
fgrep -v ',,' input的性能应该比grep -e稍好。 -
愚蠢的问题......你为什么使用外壳?如果由于大数据而需要考虑性能,为什么不编写优化的 C 程序呢? (我假设你会不止一次这样做)。
-
数据从何而来?你怎么得到它?这些巨大的文件包含哪些实际数据?你是如何运行你的基准测试的?请edit你的问题来改进它(我投票结束,因为太宽泛和不清楚)
-
@infaak,恕我直言,首先你应该有一个日志轮换机制,这样你的盒子里就没有大尺寸的文件(除非它是一个数据文件并且你有一个用户数据它,我对此表示怀疑),它真的会为您节省任何其他空间问题和不必要的问题。
-
您提到要处理一个 300GB 的文件并将其拆分为较小的文件。您提出的问题似乎是一个更大的计划的一部分,该计划将适应分裂。如果这是真的,我相信使用单个 awk,我们可以通过一次读取将 300GB 拆分为更小的文件。但是,我们需要了解这样做的条件。
标签: linux performance awk grep