GNU Parallel:如何在零处启动作业号替换字符串

时间:2016-05-18 22:41:21

标签: bash gnu-parallel

我很高兴使用GNU并行将分割多GB CSV数据库导出文件转换为可管理的块。但是,我遇到的问题是我希望我的输出文件名格式为some_table.csv.part_0000.csv从零开始(导入工具需要这个)。获得“0001”是一个挑战,但我设法使用printf来实现这一目标。我不能让减量工作。

我的命令:

FILE=some_table; parallel -v --joblog split.log --pipepart --recend '-- EOL\n' --block 25M "cat > $FILE.csv.part_$(printf "%04d"{#}).csv" :::: $FILE.csv

执行表达式扩展($FILE.csv.part_$(({#}-1)).csv)之类的操作不起作用,因为{#}会混淆内部子shell。 PART=$(({#}-1)); cat > $FILE.csv.part_$PART.csv也是如此。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用{= =} contruct:

FILE=some_table;  parallel -v --joblog split.log --pipepart --recend '-- EOL\n' --block 25M "cat > $FILE.csv.part_"'{=$_=sprintf("%04d",$job->seq()-1)=}'".csv" :::: $FILE.csv

如果您打算使用它,那么将它放入〜/ .parallel / config中来定义您自己的替换字符串:

--rpl '{0000#} $_=sprintf("%04d",$job->seq()-1)'

然后使用{0000#}:

seq 11 | parallel echo {0000#}

如果你只想要数字固定宽度(不一定是4位数):

--rpl '{0#} $f="%0".int(1+log(total_jobs()-1)/log(10))."d";$_=sprintf($f,$job->seq()-1)'

然后使用{0#}:

seq 11 | parallel echo {0#}

另外注意:为什么要将它保存到文件中?为什么不直接将其传递给数据库导入程序并使用--retries/--retry-failed重试失败的块?