我很高兴使用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
也是如此。
有什么建议吗?
答案 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
重试失败的块?