我有程序(gawk)将数据流输出到STDOUT。 处理的数据实际上是10英镑。 我不想将它保存在单个文件中,而是将其拆分为块,并可能在保存之前对每个文件应用一些额外的处理(如压缩)。
我的数据是一系列记录,我不想拆分将记录减半。 每条记录都与以下正则表达式匹配:
^\{index.+?\}\}\n\{.+?\}$
或者为了简单起见,可以假设两行(首先是不均匀的,甚至在从流的开始编号时)始终记录。
我可以:
我已经意识到GNU parallel或csplit
等命令,但不知道如何将它们组合在一起。
如果上面解释的功能可以在不编写自定义perl脚本的情况下实现,那将是很好的。然而,这可能是另一种最后的解决方案,但又不确定如何最好地实施它。
答案 0 :(得分:6)
GNU Parallel可以将stdin拆分为多个记录块。这将stdin分成50 MB块,每条记录为2行。每个块都将传递给gzip并压缩为名称[chunk number] .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)。你命令行 会爱你的。
答案 1 :(得分:1)
您可以使用split
实用程序(与GNU coreutils
相比,parallel
软件包附带了该实用程序,因此可以在目标系统上找到更多的机会)该实用程序可以读取STDIN(此外(对于普通文件),请使用按行或按大小设置的阈值,然后通过--filter CMD
选项将自定义逻辑应用于块。请参阅相应的手册页以获取详细用法。
cat target | split -d -l10000 --suffix-length 5 --filter 'gzip > $FILE.gz' - prefix.
将STDIN分成10000行,每行10000个,名称为prefix.<CHUNK_NUMBER>
的gzip压缩块,其中<CHUNK_NUMBER>
从0开始并用零填充到5的长度(例如00000
, 00001
,00002
等)。起始号码和额外的后缀也可以设置。