GNU Parallel 带有序列号 `{#}` 和 `-n` 选项

GNU Parallel with sequence number `{#}` and `-n` option

在我的 ~/.parallel/config 中使用带有 的 GNU Parallel 20210222,为什么

seq 256 | parallel -n 64 echo {0#}

输出

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04

而不是

01
02
03
04

seq 256 | parallel -n 64 echo {#}

产出

1
2
3
4

?

这不足为奇:

seq 10 | parallel -n 5 echo '{= $_=-$_ =}'

与此相同:

seq 10 | parallel --rpl '{-} $_=-$_' -n 5 echo {-}

即:

-1 -2 -3 -4 -5
-6 -7 -8 -9 -10

您可以通过在要替换的参数的前面加上要替换的参数的编号,使 {-} 成为位置替换字符串:

seq 10 | parallel --rpl '{-} $_=-$_' -n 5 echo {1-} {3-} {5-}

给出:

-1 -3 -5
-6 -8 -10

位置性可以是定义的一部分:

seq 10 | parallel --rpl '{-} 1 $_=-$_' -n 5 echo {-}

给出:

-1
-6

{#}在源码中定义为:

     '{#}'  => '1 $_=$job->seq()',

所以这是一个位置替换字符串,只会替换第一个值。

这个

{0#} $_=sprintf("%02d",$job->seq())

不是位置替换字符串,而是普通的替换字符串,每次输入都会被替换。

但它很容易变成一个位置的:

seq 256 | parallel --rpl '{0#} 1 $_=sprintf("%02d",$job->seq())' -n 64 echo {0#}
seq 256 | parallel --rpl '{0#} $_=sprintf("%02d",$job->seq())' -n 64 echo {10#}

最后一个看起来有点混乱,但那是因为我们人类会看到“10”而不是“1”(输入数字)后跟“0#”。