このスクリプトは,前回のものとほとんど同じで,行にあるそれぞれの単語を 単一の`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