msc*_*woj 6 stdin split file gnu-parallel
我有程序(gawk)将数据流输出到其STDOUT.处理的数据实际上是10英镑.我不想将它保存在单个文件中,而是将其拆分为块,并可能在保存之前对每个文件应用一些额外的处理(如压缩).
我的数据是一系列记录,我不想拆分将记录减半.每条记录都匹配以下正则表达式:
^\{index.+?\}\}\n\{.+?\}$
或者为了简单起见,可以假设两行(首先是不均匀的,甚至在从流的开始编号时)始终记录.
我可以吗:
我已经意识到像GNU并行的命令,csplit但不知道如何把它放在一起.如果上面解释的功能可以在不编写自定义perl脚本的情况下实现,那将是很好的.然而,这可能是另一个,最后的解决方案,但再次,不知道如何最好地实现它.
GNU Parallel可以将stdin拆分为多个记录块.这将stdin分成50 MB块,每条记录为2行.每个块都将传递给gzip并压缩为名称[chunk number] .gz:
cat big | parallel -l2 --pipe --block 50m gzip ">"{#}.gz
Run Code Online (Sandbox Code Playgroud)
如果您知道您的第二行永远不会以'{index'开头,您可以使用'{index'作为记录开头:
cat big | parallel --recstart '{index' --pipe --block 50m gzip ">"{#}.gz
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过以下方式轻松测试拆分是否正确:
parallel zcat {} \| wc -l ::: *.gz
Run Code Online (Sandbox Code Playgroud)
除非您的记录长度相同,否则您可能会看到不同数量的行,但均匀.
观看介绍视频以获得快速介绍:https: //www.youtube.com/playlist?list = PL284C9FF2488BC6D1
阅读教程(man parallel_tutorial).你命令行会爱你.