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と同じです。