7.14 単語数のカウント

行内の各単語を1つの「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
コード内の説明(日本語訳)

単語をaへ変換します。


# 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
コード内の説明(日本語訳)

ここからはwc -cと同じです。