行や配列をシャッフルしてくれるshufコマンドだが、最新ちょっと使う機会が増えてきたので使い方について調べてみることにした。 で、ある程度使い方が整理できてきたので、備忘で残しておくことにする。

1. 基本的な使い方

基本的な使い方としては、以下のようにパイプから入力を受け付けた要素(行)をシャッフル(ランダムに並べ替え)するという使い方になる。 (sort -Rと同じような処理)

command | shuf
[blacknon@BS-PUB-CENT7-01 ~]$ seq 1 10 | shuf
10
3
7
1
5
2
6
9
8
4

2.取得数を指定する

-n N」で、シャッフルした各要素からN個のデータを抽出して出力させる事ができる。

command | shuf -n N
[blacknon@BS-PUB-CENT7-01 ~]$ seq 1 10 | shuf
7
6
4
5
10
2
1
3
8
9
[blacknon@BS-PUB-CENT7-01 ~]$ seq 1 10 | shuf -n 3
8
7
4

3.スペース区切りの要素から取得する

shufは、-eでスペース区切りで要素を指定することで、その要素をランダムに並べ替える事ができる。

shuf -e args1 args2 args3 ...
[root@0c2827c9b35f /]# shuf -e {001..020}
018
009
003
020
004
015
016
008
011
007
013
014
012
002
017
019
005
010
006
001

パイプで受け付けた文字列を処理する場合だと、ちょっと手間がかかる。

echo {001..020} | shuf -e $(cat)
[root@0c2827c9b35f /]# echo {001..020} | shuf -e $(cat)
001
002
010
012
007
017
008
009
015
019
006
004
018
005
011
016
020
013
003
014
[root@0c2827c9b35f /]# echo {001..020} | shuf -n3 -e $(cat)
014
001
016

4.指定した範囲の数字をランダムに並べ替えて出力する

-eよりは応用が効かないのだが、 -i nn-NN でnnからNNまでの数字を並べ替えて出力してくれる。

shuf -i nn-NN
[root@0c2827c9b35f /]# shuf -i 100-120
118
116
120
103
101
114
104
108
119
100
113
102
111
105
117
115
107
112
109
110
106

5.リピートする

shufコマンドは通常であれば一度しか値が使われない様になっているのだが、-r オプションを付与することでその制限を外して、一行一行出力ごとに判断するようにする(使った要素もまた再利用する)ことができる。 なお、-n オプションを指定しないと延々と出力されるので注意。使いようによっては、yesコマンド代わりにも利用できそうだ。

shuf -r -e ...
command | shuf -r
[root@0c2827c9b35f /]# shuf -e yes -n 10 -r
yes
yes
yes
yes
yes
yes
yes
yes
yes
yes
[root@0c2827c9b35f /]# shuf -e {yes,no} -n 10 -r
no
yes
no
no
no
yes
no
yes
no
no