gpt4 book ai didi

bash - 一个大文件的条件分割

转载 作者:行者123 更新时间:2023-11-29 09:36:14 24 4
gpt4 key购买 nike

我有一个非常大的文件(> 5 亿行),我想根据其中一列的前 3 个字符拆分成几个较小的文件。

它看起来像这样,其中第 1 列和第 2 列的每个元素都是唯一的:

A0A023GPI8  A0A023GPI8.1    232300  1027923628
A0A023GPJ0 A0A023GPJ0.2 716541 765680613
A0A023PXA5 A0A023PXA5.1 559292 728048729
A0A023PXB0 A0A023PXB0.1 559292 728048786
A0A023PXB5 A0A023PXB5.1 559292 728048524
A0A023PXB9 A0A023PXB9.1 559292 728048769
A0A023PXC2 A0A023PXC2.1 559292 728050382

我使用了以下脚本,认为它会非常快,因为在我看来它涉及对整个文件的一次读取。然而,它已经运行了好几天,还远远没有完成。有什么想法可以解释原因和建议的解决方案吗?

while read line
do
PREFIX=$(echo "$line" | cut -f2 | cut -c1-3)
echo -e "$line" >> ../split_DB/$PREFIX.part
done < $file

最佳答案

它可能很简单:

$ awk '{s=substr($2,1,3); print >> s}' file

>> 将打印重定向到按给定名称附加文件。名称由第二列的前 3 个字母组成。

这将比 Bash 处理该文件快得多。


注意事项:

通常操作系统对同时打开的文件数量有限制。这可能是一个问题,具体取决于第二列前 3 个字符中潜在字符组合的数量。这将影响在处理给定文件时这些名称的文件保持打开状态的任何解决方案——而不仅仅是 awk。

如果您有 000999 那就是 999 个可能打开的文件;如果你有 AAAZZZ 那就是 17,575;如果你有三个大小写字母数字,即 238,327 个潜在 打开文件...如果你的数据只有几个唯一前缀,你可能不需要担心这个;如果您声明数据的详细信息,此处建议的解决方案可能会有所不同。

(您可以根据 3 个字符中允许的字母表长度,将 'ZZZ' 的基本转换为十进制来计算潜在组合。('0'..' 9','A'..'Z') 是基数 32 ('0'..'9','a'..'z','A'..'Z') 是 base 62 等等。)

如果需要(在合理范围内),您可以提高大多数 Unix 风格操作系统的限制,或者根据需要打开和关闭新文件。将文件限制提高到 238,327 是不切实际的。您还可以对数据进行排序,并在以前的文件不再使用时将其关闭。

关于bash - 一个大文件的条件分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47476170/

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