0

文字と整数の 2 つの引数を取る bash スクリプトがあります。その整数の長さのその文字で始まるアルファベットで文字を出力したい(アルファベットを法とする)

#!/bin/bash

[[ $# != 2 ]] && echo Exactly 2 argument needed && exit 1
[[ "$1" =~ ^[a-zA-Z]$ ]] || { echo Enter only one char; exit 2; }
[[ "$2" =~ ^[0-9]+$ ]] || { echo Enter integer; exit 3; }

letter="$1"
cnt="$2"
letter=`printf "%d" \'$letter`;
z=`printf "%d" \'z`
a=`printf "%d" \'a`
[[ "$1" =~ ^[[:upper:]]$ ]] && { ((letter+=32)); }           # make lower

while [[ "$cnt" -gt 0 ]]; do

  printf \\$(printf "%03o" "$letter")
  ((letter++))
  [[ "$letter" -gt $z  ]] && letter=$a                       # alphabet modulo
  ((cnt--))
done   
echo ""  

このスクリプトは問題なく動作しますが、遅すぎます。2x n (int の値) を printf プログラムと呼ぶ必要があります。

私の質問はenable printf、printfの実行速度を上げるための実用的なソリューションや、printfをまったく使用しないソリューションのようなものがあるかどうかです。

私は bash を使用する必要があり、可能な限り最速の方法で ASCII を処理する方法を知りたいだけです。私はcygwin atmでスクリプトを書いているので、それに関連して速度が低下する可能性があります。

このスクリプトは問題の単なる例です。「stdout フラッシュ バッファ サイズを増やす」ソリューションは必要ありません。ありがとう :)

4

1 に答える 1

2

どうぞ:

#!/bin/bash

[[ $# != 2 ]] && echo Exactly 2 argument needed && exit 1
[[ "$1" =~ ^[a-zA-Z]$ ]] || { echo Enter only one char; exit 2; }
[[ "$2" =~ ^[0-9]+$ ]] || { echo Enter integer; exit 3; }

alpha=`echo {a..z}|sed 's/ //g'`
letter="$1"
cnt="$2"
letter=$(expr `printf "%d - %d + 1" \'$letter \'a`;)

[[ "$1" =~ ^[[:upper:]]$ ]] && { ((letter+=32)); }           # make lower

echo -n `echo $alpha |tail -c +$letter |head -c $cnt`
((cnt=cnt-26))
while [[ "$cnt" -gt 0 ]]; do
    echo -n `echo $alpha |head -c $cnt`
    ((cnt=cnt-26))
done
echo ""

このプログラムは、ブレース展開を使用しa..zて文字のリストに展開し、この文字列を先頭と末尾を使用してサイズに合わせてカットして表示します。さらに最適化することもできますが、それはあなたのための演習です。

パフォーマンスの比較 (<1>は問題の<2>コード、 はこの回答のコード):
* スタートアップ セクションには の 3 つのコマンド<2>と比較して、 の4 つのコマンドがあります<1>
*<2>では 26 文字あたり 4 つのコマンド (echo (x2)、head、tail) が実行されますが、1 文字あたり 1 つのコマンドが実行され<1>ます。
*<2>は 26 文字ごとに 1 つの算術演算を行いますが、<1>文字ごとに 2 つの算術演算を行います。

samveen@precise:/tmp$ time bash 1.sh a 1000
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl

real    0m2.065s
user    0m0.244s
sys     0m0.552s
samveen@precise:/tmp$ time bash 2.sh a 1000
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl

real    0m0.285s
user    0m0.024s
sys     0m0.060s

参考文献:man bash

于 2013-06-04T13:18:18.530 に答える