人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【至急】カレントにあるファイルをランダムに抽出するスクリプトで困っています。
bashであれば、以下のスクリプトでカレントにあるファイル名を標準出力します。
filenum=(`ls -1 | wc -l`)
files=(`ls -1`)
num=`expr $RANDOM % $filenum`
echo ${files[${num}]}
これと同じことをborne shallとawkしかないWebプラットフォーム上で実現したいのですが、配列が使えないため、困っています。
突然本日中に実現しないといけないため、みなさんのお知恵を拝借したいと存じます。
よい方法をご教授願います。

●質問者: cochoo
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●300ポイント ベストアンサー

んー、乱数が難しいです。
もし、awk ではなく、nawk が使えるのであれば、こんな感じでいけます。

#! /usr/bin/sh

LIST=`ls`
N=`echo "$LIST" | wc -l`

echo "$LIST" | /usr/bin/nawk "
BEGIN {
 srand()
 i = int(rand() * ${N}) + 1
}
NR == i {
 print
}
"



もうひとつ。

http://news.mynavi.jp/articles/2010/04/30/shell-random-number/index.html
上記のページで、疑似デバイス /dev/random を使って乱数を取得する方法があるのを知りました。

もし、/dev/random があって、od コマンドが使えるなら、以下のような感じでいけます。

#! /usr/bin/sh

LIST=`ls`
N=`echo "$LIST" | wc -l`

RND=`od -vAn -N4 -tu4 < /dev/random`

echo "$LIST" | /usr/bin/awk "
BEGIN {
 i = ${RND} % ${N}
}
NR == i {
 print
}
"

乱数の精度は、こちらの方が高いです。


a-kuma3さんのコメント
awk でも使える可能性があるので、nawk を awk に変えてやってみる、というのはありかも。 もし、rand() が使えなければ、構文エラーになります。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ