gpt4 book ai didi

file - 将 STDIN 拆分为多个文件(并尽可能压缩它们)

转载 作者:行者123 更新时间:2023-12-04 14:45:06 26 4
gpt4 key购买 nike

我有程序 (gawk) 将数据流输出到其 STDOUT。
处理的数据实际上是 GB 的 10 秒。
我不想将它保存在单个文件中,而是将其拆分为多个块,并可能在保存之前对每个块应用一些额外的处理(如压缩)。

我的数据是一系列记录,我不想拆分将记录切成两半。
每条记录都匹配以下正则表达式:
^\{index.+?\}\}\n\{.+?\}$
或者为简单起见,可以假设两行(第一行不均匀,然后即使从流的开头编号)总是记录。

我可以吗:

  • 使用一些标准的 linux 命令通过定义块的优选大小来拆分 STDIN?不需要精确给定记录变量大小无法保证。或者只是记录数,如果 def。按尺寸是不可能的
  • 压缩每个块并存储在一个文件中(名称中有一些编号,如 001、002 等。)

  • 我已经意识到像 GNU parallel 这样的命令或 csplit但不知道如何组合。
    如果可以在不为其编写自定义 perl 脚本的情况下实现上述功能,那就太好了。然而,这可能是另一种最后的解决方案,但同样,不确定如何最好地实现它。

    最佳答案

    GNU Parallel 可以将标准输入拆分为记录块。这会将 stdin 拆分为 50 MB 的块,每条记录为 2 行。每个块都将传递给 gzip 并压缩为名称 [块编号].gz:

    cat big | parallel -l2 --pipe --block 50m gzip ">"{#}.gz

    如果您知道您的第二行永远不会以 '{index' 开头,您可以使用 '{index' 作为记录开始:
    cat big | parallel --recstart '{index' --pipe --block 50m gzip ">"{#}.gz

    然后,您可以通过以下方式轻松测试拆分是否正确:
    parallel zcat {} \| wc -l ::: *.gz

    除非您的记录长度都相同,否则您可能会看到不同数量的行,但都是均匀的。

    观看介绍视频以获得快速介绍:
    https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    完成教程 (man parallel_tutorial)。你命令行
    会因此而爱你。

    关于file - 将 STDIN 拆分为多个文件(并尽可能压缩它们),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628610/

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