[sh][Linux] ランダムな4桁の16進数を生成するfasterな方法
前回の続き.
naive過ぎるので
cat /dev/urandom | tr -dc [:xdigit:] | \ head -c `expr 4 \*1024` | \sed -e 's/\(.\{4\}\)/\1\n/g'
と改良.
これならばランダム性と4桁必ず出ることが保証されている. そして短い. 0.023 sec 程度の実行速度なので,ダントツで早い.
ランダムな4桁の16進数を生成するnaiveな方法
cat /dev/urandom | tr -dc '[:xdigit:]' | head -c 4 | tr '[:upper:]' '[:lower:]'
最後のtrコマンドはおまけ.
cat /dev/urandom
は処理時間が掛かるためhead -c 1000 /dev/urandom
の方が早い.
ただし,必ずしも毎回4桁出力されるわけではない点に注意.
for i in `seq 0 1023`; do <上記コード> done
のような場合,2種類を試すと,
method | time [sec] |
---|---|
cat | 26.161 |
head | 2.769 |
となり約9.5倍程度の差がついた. なお10回の試行をタイムコマンドで計測した平均を用いている.
xargsでシェル組込み機能(リダイレクトなど)を使う
参考: xargsでもパイプとかif文とか使いたい - BlankTar
echo -n >cmd_list for f in `find . -type f -name ".log"`; do echo "perl foo.pl ${f} 2>&1 log_${foo/./_result.}" >> cmd_list done cat cmd_list | xargs -I % sh -c "%"
xargsコマンドで並列処理を簡単に行うことができます。 ただ、パイプなどシェルの組込み機能を使おうとすると、xargsコマンドでは上手く処理できません。 sh(任意のシェル)コマンドを用いるとパイプライン処理やリダイレクト、はたまたifとかができるようです。