連載
» 2017年05月25日 05時00分 公開

Linux基本コマンドTips(112):【 shuf 】コマンド――入力行をシャッフルして出力する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、入力した内容をランダムな順番で出力する「shuf」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、入力した内容をランダムな順番で出力する「shuf」コマンドです。

shufコマンドとは?

 「shuf」はファイルやキーボードから入力した内容をシャッフル(shuffle)して出力するコマンドです。乱数とは違い、同じものが2回出力されることはありません。「1から10までの数字をランダムな順番で1回ずつ出力する」といった使い方も可能です。



shufコマンドの書式

shuf [オプション] [ファイル名]

※[ ]は省略可能な引数を示しています





shufコマンドの主なオプション

 shufコマンドのオプションのうち、「-eオプション」と「-iオプション」を同時に使用することはできません。

短いオプション 長いオプション 意味
-e リスト --echo リスト 「-e a b c」のように空白で区切ったリストをランダムに並べ替えて出力する
-i 範囲 --input-range=範囲 「-i 1-10」のように、「数値-数値」で指定した範囲の数値を出力する(小さい数を先に指定する)
-n 行数 --head-count=行数 出力する最大の行数を指定する
-o ファイル名 --output=ファイル名 結果をファイルに書き出す
--random-source=ファイル名 ランダムバイトのソースファイルを指定する
-z --zero-terminated 行末を改行文字ではなくNULL文字にする


テキストファイルをランダムに並べ替えて出力する

 「shuf ファイル名」でテキストファイルの各行を“シャッフル”して、並べ替えてから出力します。並べ替えの順番はランダムです(画面1)。

 「-n 行数」で出力する行数を指定します。ただし、ファイルの行数より多い数を指定しても無効です。

コマンド実行例

shuf ファイル名

(ファイルの行をランダムに並べ替えて出力する)(画面1

shuf -n 行数 ファイル名

(ファイルの行をランダムに並べ替えて、指定した行数分だけ出力する)


画面1 画面1 ファイルの行をランダムに並べて出力した結果


文字列をランダムに並べ替えて出力する

 「-e」オプションを使い、コマンドラインで指定したキーワードをランダムに並べ替えて出力します。キーワードは「-e key1 key2 key3」のようにスペースで区切って指定します(画面2)。

コマンド実行例

shuf -e キーワードリスト

(スペースで区切ったキーワードのリストをランダムに並べ替えて出力する)(画面2


画面2 画面2 キーワード(文字、文字列)のリストを並べ替えて出力した結果


数字をランダムに並べ替えて出力する

 「-i」オプションで、数字をランダムに並べ替えて出力できます。

 「-i」オプションでは、出力する範囲を付けて「-i 1-10」のように指定します(画面3)。「1-10」と指定した場合、1から10までの整数が全て1回ずつ出力されます。

コマンド実行例

shuf -i 範囲

(「数字-数字」で指定した範囲の数をランダムに並べ替えて出力)(画面3

shuf -i 範囲 -n 個数

(数字をランダムに並べ替えて、指定した個数だけ出力)


画面3 画面3 数字を並べ替えて出力した結果

 shufコマンドの出力結果は乱数と似ていますが、実際には異なります。shufは指定された範囲の数字をシャッフルしているので、出力は乱数にはなりません。画面3のように各数の出現回数は1回ずつです。乱数なら同じ数が現れることがあります。

 乱数が必要な場合は環境変数RANDOMや/dev/urandom、あるいはプログラミング言語が備える乱数用の関数を使用するとよいでしょう。

 bash/zshでは、RANDOMを参照するごとに0から32767の整数を作り出します(画面4)。画面4ではbashの%演算子を用いて、0から9までの剰余を求め、それに1を加えて、1から10までの数を得ています。

画面4 画面4 環境変数RANDOMから乱数を得た結果


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。