seqの出力をランダムに抽出する方法は?

seqの出力をランダムに抽出する方法は?

私はそれを使っseqて乱数リスト(1、2、3、4...)を生成できることを知っています。

この数字を3、1、4、2のようにランダムな順序で入力したいと思います。

私はshufファイルの行を混乱させるために何を使用できるかを知っています。したがって、これを使用してseqファイルにランダムな数字を書き、shufそれをシャッフルしたり、いくつかの種類のシャッフル機能を作成したりできます。しかし、これは不必要に複雑に見えます。単一のコマンドを使用して配列内の項目をランダムに指定する簡単な方法はありますか?

答え1

出力をshuf

$ seq 100 | shuf

はい

$ seq 10 | shuf
2
6
4
8
1
3
10
7
9
5

出力を水平にするには、パイプで接続してくださいpaste

$ seq 10 | shuf | paste - -s -d ' '
1 6 9 3 8 4 10 7 2 5 

$ seq 10 | shuf | paste - -s -d ' '
7 4 6 1 8 3 10 5 9 2 

$ seq 10 | shuf | paste - -s -d ' '
9 8 3 6 1 2 10 4 7 5 

の間にカンマを入れますか?区切り文字を次に変更しますpaste

$ seq 10 | shuf | paste - -s -d ','
2,4,9,1,8,7,3,5,10,6

答え2

単一のコマンドを使用して配列内の項目をランダムに指定する簡単な方法はありますか?

10進整数配列があるとしましょう。

arr=(4 8 14 18 24 29 32 37 42)

sumを使用して配列要素をランダムprintfに指定できます。shuf

$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18

(上記では修正していないと仮定します$IFS。)


などの2つの整数の間の乱数のみが必要な場合は、次の10オプションを使用する20以外に追加の手順は必要ありません。shuf-i

$ shuf -i 10-20
12
10
20
14
16
19
13
11
18
17
15

引用元man shuf:

   -i, --input-range=LO-HI
          treat each number LO through HI as an input line

答え3

printf '%s, ' `seq 1 10 | shuf`

ループも必要ありませんfor

出力

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

これをシェル配列に入れるには:

( set -- $(seq 1 10 | shuf) ; printf '%s, ' "$@" )

出力

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

それからシェル配列にあります。

シェル配列に入れると、以下は必要ありませんprintf

( set -- $(seq 1 10 | shuf); IFS=, ; echo "$*" )

出力

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

ところで、seq彼らはprintf完全に一致しています。たとえば、文字列を1000回繰り返したい場合はどうすればよいですか?

printf 'a string\n%.0b' `seq 1 1000`

出力

a string

... a string999行目後で...

a string

または...

printf 'a string,%.0b' `seq 1 10`

出力

a string,a string,a string,a string,a string,a string,a string,a string,a string,a string,

コマンドを39回実行したいですか?

printf 'echo "run %d"\n' `seq 1 39` | . /dev/stdin

出力

run 1

...38run行目以降...

run 39

答え4

shuf次のコマンドを使用して、出力をランダムに指定できます。

%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9 

関連情報