wc コマンド

wc オプション ファイル名 またはパイプの形式で cat ファイル名 | wc オプション のようにして、行数や文字数などを数える。

ファイルの行数を数えるのなら、パイプを使わずにファイル名をパラメータに渡したほうが速い。他のコマンドの出力を数えるにはパイプの形式を使う。

ファイル名を引数で渡す場合は複数のファイル名を渡すこともできる。その場合は合計ではなく、ファイルごとに数えてくれる。

行数はあくまで改行の数を数えているにすぎないことに注意。最後に改行のない行があった場合はその行がカウントされない。

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

オプション

-c, --bytes
バイト数を数える。最後に改行がある場合はそれも数える。
--help
ヘルプ表示
-l, --lines
行数を数える。実際には改行の数を数えるだけなので、"1\n2\n" は2行と 数えるが、"1\n2" は1行と数える。改行が1つもないと中身が存在しても0行と 数える。
-m, --chars
文字数を数える。マルチバイトな文字もあくまで文字単位で数える。 手元の環境ではUTF-8だとコードポイントの数になり、 UTF-16とかだとよくわからない数になる。 最後に改行がある場合はそれも数える。 改行コードがCRLFの場合はそれを2文字と数える。
--version
バージョン表示

-- というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、 - で始まるファイル名を扱いたい場合に使うとよい。

ディレクトリの中の全ファイルの行数の合計を数えるには

カレントディレクトリの中にサブディレクトリがなくてファイルしかない場合は

$ wc -l *

これで、最後の行に合計の行数が表示される。

Perlのワンライナーで行数を数えるには

Perlでは $. という暗黙の変数が便利。 $. は最後に読み込んだファイルハンドルの現在の行番号を表す。以下のように使える。

$ perl -nle 'END {print $.}'

grepで行数をカウントするには

$ grep -c '' foo.txt

わずかに wc -l のほうが速い。一行がとても長いファイルだと、wc -l のほうが5倍以上速いケースもあり、行数を数えるだけであればわざわざ grep を使う必要性はほとんどない。

grep -c ''wc -l もほとんどはIOに時間がかかる。CPUの使用量はgrepのほうが多い。

ただ、2つのコマンドはカウント結果が異なる場合がある。最後の行に改行が含まれない場合、wc -l では最後の行をカウントしないが、 grep -c '' では最後の行もカウントする。 wc -l は実際には行数ではなく改行の数を数えているためである。

なお、正規表現にマッチする行のみの行数をカウントする場合は

$ grep PATTERN foo.txt | wc -l

よりも

$ grep -c PATTERN foo.txt

のほうが速い。

UTF-16でのコード数をカウントするには

つまりサロゲートペアになる文字は2文字とカウントさせるには、UTF-16に変換してそのバイト数を2で割ればよい。

$ cat foo.txt | iconv -f UTF-8 -t UTF-16 | wc --bytes | perl -nle 'print $_/2'
## または
$ cat foo.txt | iconv -f UTF-8 -t UTF-16 | wc --bytes | awk '{print $1/2}'
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。