我正在尝试生成一个逗号分隔的无序的1 到 10 之间的整数列表,我尝试了以下操作,但结果是一个有序列表:
seq -s "," 10 | shuf
答案1
您可以使用paste -s
连接线:
shuf -i1-10 | paste -sd, -
这使用-i
shuf 选项来指定正整数范围。
的输出seq
可以通过管道传输到 shuf:
seq 10 | shuf | paste -sd, -
或者-e
打乱参数:
shuf -e {1..10} | paste -sd, -
答案2
有两种 1 到 10 之间的数字列表。您需要哪一种?
解释它们的最好方法是使用一个类比:
将 10 个编号为 1 到 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
将 10 个编号为 1 到 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
答案3
shuf
打乱行顺序,如果只给它一行,可能的结果并不多。相反,给它行,然后将换行符更改为逗号:
$ seq 10 | shuf | tr '\n' ',' | sed '$s/,$/\n/'
1,7,8,2,9,4,6,3,5,10
(最后一个sed
将最后一个逗号更改为换行符。可能有更好的方法。就像paste
在@rowboat 的回答)