spu*_*ger 2 shell random numeric-data
我正在尝试生成一个逗号分隔的1 到 10 之间整数的无序列表,我尝试了以下操作,但结果是一个有序列表:
seq -s "," 10 | shuf
Run Code Online (Sandbox Code Playgroud)
row*_*oat 12
您可以使用paste -s
连接线:
shuf -i1-10 | paste -sd, -
Run Code Online (Sandbox Code Playgroud)
这使用-i
shuf 选项来指定一系列正整数。
的输出seq
可以通过管道传输到 shuf:
seq 10 | shuf | paste -sd, -
Run Code Online (Sandbox Code Playgroud)
或者-e
改组参数:
shuf -e {1..10} | paste -sd, -
Run Code Online (Sandbox Code Playgroud)
1 到 10 之间的数字列表有两种。您需要哪一种?
解释它们的最好方法是使用一个类比:
将编号为 1 到 10 的 10 个球放入袋中。在每一轮中取出一个球,读取数字并且不要将球放回袋中。这会生成最多 10 个数字的列表。所有数字都将出现在列表中,但(强制)只出现一次。
这样的列表将由类似于以下的命令生成:
$ echo $(seq 10 | shuf) | tr " " ","
10,7,5,2,3,9,1,4,8,6
$ shuf -i1-10 | paste -sd, -
1,9,4,6,2,8,10,5,3,7
Run Code Online (Sandbox Code Playgroud)
将编号为 1 到 10 的 10 个球放入袋中。每次从袋子中取出一个球,读取上面的数字,然后将球放回袋子中。列表可能是无限的,数字可能需要一段时间才能重复。
可以使用类似于以下命令的命令生成这样的列表:
$ shuf -n 20 -r -i1-10 | paste -sd, -
9,9,7,8,2,8,5,5,4,9,8,6,6,6,4,10,6,6,9,7
Run Code Online (Sandbox Code Playgroud)
shuf
shuffle lines,如果你只给它一行,那么可能的结果并不多。相反,给它行,然后将换行符更改为逗号:
$ seq 10 | shuf | tr '\n' ',' | sed '$s/,$/\n/'
1,7,8,2,9,4,6,3,5,10
Run Code Online (Sandbox Code Playgroud)
(最后一个sed
将最后一个逗号更改为换行符。可能有更好的方法。就像paste
在@rowboat 的答案中使用as一样)