単語の個数のカウント

How can I count unique terms in a plaintext file case-insensitively? - Stack Overflow からですが、問題としては「大文字小文字を区別せずに出現する単語の種類を数える」というものです。

awk を使う場合、単語 = フィールドで分割されますが、これを処理するには for 文で記述する必要があり、プログラムとしては長くなってしまいます。 そこで、RS を変更することで処理を行います。

$ echo "This this\n that this" |\
  gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}'
2

上の場合には "this" と "that" の 2 種類の単語しか出現していませんので、結果として 2 が出現します。 NF は「行が空でない場合の処理」を意味します。

!a[$0]++

という表現はソートしない uniq の常套句なので、覚えておくと良いでしょう。 つまり、最初の出現の時のみの処理になります。

tag_gawk.pngtag_gawk.png