如何将 GNU split 的“过滤器”选项与 GNU parallel 一起使用?

如何将 GNU split 的“过滤器”选项与 GNU parallel 一起使用?

我正在尝试将大量 gz 文件分割成 N 行压缩的 gzip 块。

为了证明这一点,让我们考虑以下情况:

seq 100 | gzip > big_file0.gz

我可以将其拆分为多个 10 行的压缩文件,如下所示:

zcat big_file0.gz | split -l 10 --filter='gzip > $FILE.gz' - big_file0.

假设我们有许多大文件big_file0.gzbig_file1.gz......

我现在想使用 GNU parallel 拆分每个文件。这是我想到的命令:

parallel "zcat {} | split -l 10 --filter='gzip > $FILE.gz' - {.}." ::: big_file0.gz big_file1.gz

但是,shell 的替换$FILE不能按预期工作。$FILE被替换为空字符串,因此所有输出都写入名为的文件中.gz

我怎样才能使$FILE替换在 GNU parallel 中按预期工作?

答案1

Shell 变量扩展会转换$FILE为空字符串。需要在前面加上反斜杠,$FILE以防止 Shell 进行扩展。

答案2

今天,您可以使用 GNU Parallel 的--pipe选项:

parallel --seqreplace // "zcat {} | parallel --pipe -N 10 gzip '>{.}.{#}.gz'" ::: big_file0.gz big_file1.gz

如果您同意附加,big_file0.gz big_file1.gz则更简单:

zcat big_file0.gz big_file1.gz | parallel --pipe -N 10 gzip '>{#}.gz'

相关内容