Shell 访问 GNU Parallel 的作业总数
Shell access to GNU Parallel's total number of jobs
当使用选项 --eta 调用时,GNU Parallel 计算的作业总数为 运行。有什么方法可以使 shell 可以使用此值,或许可以使用替换字符串?
除其他外,这对于零填充作业编号很有用。例如,如果作业总数的替换字符串是 {###},则可以按如下方式进行零填充:
printf "%0$(printf {###} | wc -m)d" {#}
目前没有办法做到这一点。
原因是要计算作业数量,GNU Parallel 必须构建要执行的命令。如果您使用 -X,则作业数取决于替换字符串的长度,因此 GNU Parallel 在开始构建第一个命令时不知道作业数。只有所有的命令都构建出来了,GNU Parallel 才知道有多少。
要了解为什么这是一个问题,请查看这个悖论。正确的是:
$ seq 1000 1010 | parallel -Xj1 -s 17 echo {###} {}
6 1000 1001
6 1002 1003
6 1004 1005
6 1006 1007
6 1008 1009
6 1010
或者:
$ seq 1000 1010 | parallel -Xj1 -s 17 echo {###} {}
11 1000
11 1001
11 1002
11 1003
11 1004
11 1005
11 1006
11 1007
11 1008
11 1009
11 1010
你可以争论他们两个都是正确的。
当使用选项 --eta 调用时,GNU Parallel 计算的作业总数为 运行。有什么方法可以使 shell 可以使用此值,或许可以使用替换字符串?
除其他外,这对于零填充作业编号很有用。例如,如果作业总数的替换字符串是 {###},则可以按如下方式进行零填充:
printf "%0$(printf {###} | wc -m)d" {#}
目前没有办法做到这一点。
原因是要计算作业数量,GNU Parallel 必须构建要执行的命令。如果您使用 -X,则作业数取决于替换字符串的长度,因此 GNU Parallel 在开始构建第一个命令时不知道作业数。只有所有的命令都构建出来了,GNU Parallel 才知道有多少。
要了解为什么这是一个问题,请查看这个悖论。正确的是:
$ seq 1000 1010 | parallel -Xj1 -s 17 echo {###} {}
6 1000 1001
6 1002 1003
6 1004 1005
6 1006 1007
6 1008 1009
6 1010
或者:
$ seq 1000 1010 | parallel -Xj1 -s 17 echo {###} {}
11 1000
11 1001
11 1002
11 1003
11 1004
11 1005
11 1006
11 1007
11 1008
11 1009
11 1010
你可以争论他们两个都是正确的。