【至急】カレントにあるファイルをランダムに抽出するスクリプトで困っています。

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/10/05 18:26:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント300pt

んー、乱数が難しいです。
もし、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
}
"

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

id:a-kuma3

awk でも使える可能性があるので、nawk を awk に変えてやってみる、というのはありかも。
もし、rand() が使えなければ、構文エラーになります。

2012/10/05 17:25:45
  • id:stunvddlpoutfn9
    ベストアンサーにしてくれたら、がんばって調べて教えます!!
  • id:cochoo
    了解しました。よろしくお願いいたします!
  • id:y-kawaz
    回答書こうと思ったら終了してた…。

    一応加工とした回答書いておきます。
    要は ls や wc とかが無く、bash と awk しかバイナリがない状況で何とかしたいと理解したのですがbashのみで以下で行けると思いますよ。

    >|sh|
    files=(*)
    echo ${files[$RANDOM%${#files[@]}]}
    ||<

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません