シェルでshufコマンドを使って入力情報をいろんな方法でシャッフルしてみる(組み合わせにも使える)
はじめに
過去のブログエントリで何度か取り上げていた shuf
コマンドですが、 オプションを組み合わせることでいろいろなシャッフル方法を実現できるので紹介します。
ちなみに shuf
コマンドを取り上げていた過去のエントリは以下になります。参考にどうぞ。
検証環境
shufコマンドとは
標準入力 あるいは 引数に指定したファイル の各行を 入れ替え(シャッフル) して、出力するコマンドです。
「標準入力」、「引数でファイル指定」のそれぞれの方法で shuf
コマンドを使った後、 便利なオプションについて触れてみたいと思います。
標準入力から読み込ませる
標準入力 から情報を読み込ませる場合、パイプを使って shuf
コマンドに引き渡すのがほとんどです。
1から5までの数値を shuf
コマンドに食わせて、各行を入れかせてみます。
ファイルを指定して読み込ませる
すでにシャッフルしたいデータファイルが存在する場合には、そちらを利用することも可能です。
オプション
データを読み込ます方法を紹介しましたが、ここからは オプション について見ていきます。
-e
オプション
標準入力 あるいは ファイルを指定 することでランダムに出力させたいデータを読み込ませる以外にも、コマンドライン引数から文字列を渡すことが可能です。
ちょっとした内容であればこれでもいいかもしれません。(4人でゲームする際の開始順序を決めるとか。バドミントンのペアを決めるとか。)
-i
オプション
任意の範囲の数値をランダムに並べることができます。
次の例では、2から4 の3つの数値をランダムに並べています。
数値しか利用できない点に注意です。
-n
オプション
シャッフルした行の内、指定した行数だけを出力させたい場合に利用します。
以下の例では、1行目から9行目の内容をランダムに並べ替えした後、3行分だけ出力します。
こちらも、他のコマンドと組み合わせて実現はできます。
例えば、 head
コマンドを使って3行だけ取り出してやれば、同じことが実現可能です。
-o
オプション
ランダムに行を並べ替えた結果をファイルに出力するオプションですが、 >
リダイレクトを使えばよいのであまり出番がないかと。
想定される使い方としては sudo
コマンドで実行し、実行結果を root
所有ファイルに書き出す、ぐらいでしょうか。
-r
オプション
場合によってはこのオプションを知っているか知らないかで便利さが変わってくると思っています。
今までのシャッフル方法は、出力結果に同じ行が登場することが有りませんでした。
例えるなら 「箱の中からくじを順番に引いていく。ただし引いたくじは箱に戻さない」 というケースでした。-r
オプションをつけるとこの挙動が 「箱の中からくじを順番に引いていく。引いたくじは毎回箱に戻す」 というものにかわります。
注意しないといけないこととして、 -n
や head
コマンドとの組み合わせはほぼ必須だということです。これをしないと延々とコマンドの実行が終了しません。
任意の行データのみを採用してシャッフルしたい
標準入力に渡された情報のうち、任意の行データのみを採用してシャッフルしたい場合には以下のように sed
と組み合わせて実現しましょう。
sed
コマンドを使って2行目から4行目だけを取り出し、 shuf
コマンドに渡しています。
ひとこと
-r
オプションをうまく使えば、組み合わせの問題を解くためにも使えそうです。
ディスカッション
コメント一覧
まだ、コメントがありません