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

saf*_*fsd 4 shell gnu-parallel

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

为了演示,让我们考虑以下内容:

seq 100 | gzip > big_file0.gz
Run Code Online (Sandbox Code Playgroud)

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

zcat big_file0.gz | split -l 10 --filter='gzip > $FILE.gz' - big_file0.
Run Code Online (Sandbox Code Playgroud)

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

我现在想使用 GNU 并行分割这些文件中的每一个。这是我想出的命令:

parallel "zcat {} | split -l 10 --filter='gzip > $FILE.gz' - {.}." ::: big_file0.gz big_file1.gz
Run Code Online (Sandbox Code Playgroud)

但是,外壳替换 并$FILE没有按预期工作。$FILE被替换为空字符串,因此所有输出都写入名为.gz.

如何让$FILE替换在 GNU 并行中按预期工作?

Kyl*_*nes 5

Shell 变量扩展正在转换$FILE为空字符串。您需要在前面添加一个反斜杠$FILE以防止 shell 进行扩展。