このスクリプトは,前回のものとほとんど同じで,行にあるそれぞれの単語を 単一の‘a’に一度変換します(前回のスクリプトでは,それぞれの文字を ‘a’に変更しています).
本物のwc
プログラムはwc -c
に対しループが最適化されているの
で,文字を数えるより単語を数える方がはるかに遅くなります.これらのスク
リプトのボトルネックは,どちらかというと算数にあり,このため,単語を数
えるものはより速くなります(より小さい数を管理する必要があります).
前回同様,共通部分にはsedスクリプトへのコメントの重要性を示す コメントがありません.
#!/usr/bin/sed -nf # Convert words to a's s/[ tab][ tab]*/ /g s/^/ / s/ [^ ][^ ]*/a /g s/ //g # Append them to hold space H x s/\n// # From here on it is the same as in wc -c. /aaaaaaaaaa/! bx; s/aaaaaaaaaa/b/g /bbbbbbbbbb/! bx; s/bbbbbbbbbb/c/g /cccccccccc/! bx; s/cccccccccc/d/g /dddddddddd/! bx; s/dddddddddd/e/g /eeeeeeeeee/! bx; s/eeeeeeeeee/f/g /ffffffffff/! bx; s/ffffffffff/g/g /gggggggggg/! bx; s/gggggggggg/h/g s/hhhhhhhhhh//g :x $! { h; b; } :y /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ y/bcdefgh/abcdefg/ /[a-h]/ by p