我正在尝试将大量 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.gz
,big_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'