次: , 前: wc -c, 上: Examples


4.10 単語を数える

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