wcを理解する
wcは改行・単語・バイトなどの数を数えます。画面上で何行に見えるかと、ファイル中の改行の数は同じとは限りません。ASCII入力から始め、数える単位を指定して検算します。
この単元で学ぶこと
- -l/-w/-c/-mの数える対象を区別する
- 末尾改行の有無から結果を計算する
- 標準入力とファイル指定での出力を区別する
本文解説
何を数えるか wcの既定出力は改行数、単語数、バイト数の順です。printf 'a b\n' | wcでは1、2、4です。aとbが二語、空白と改行を含めたASCII四バイトです。数値の前には桁揃え空白が付く場合があるため、ここでは内容の数として比較します。
改行を数える-l printf 'abc' | wc -lは0です。文字が表示されても改行がないからです。printf 'abc\n'なら1になります。末尾改行のない最終行を視覚的に一行と考えることと、wc -lの改行数を同一視しないようにします。
単語の区切り wc -wは空白類で区切られた非空白の並びを単語として数えます。printf 'a b\tc\n'では3です。空白二個で空の単語を二つ追加するわけではありません。a,bのように空白なしの句読点でつながる場合は、このASCII/Cロケール例では一語です。
バイト数と文字数 -cはバイト、-mは文字を数えます。ASCII例なら一致しますが、複数バイト文字を含むUTF-8では異なる場合があります。-mの解釈はロケールに依存するため、任意の日本語をLC_ALL=Cのまま数えた結果を文字数として一般化しません。
空白と改行もバイト printf 'a b\n'の-cが4なのはa、空白、b、LFが各一バイトだからです。printf 'a\nb'ならa、LF、bの三バイトで-lは1。見える文字数だけを数えるとバイト数を一つ小さく見積もることがあります。
ファイル名の表示 wc -l data.txtは数値とファイル名を表示します。wc -l < data.txtは標準入力を読むので、通常は数値だけです。複数ファイルを指定すれば各ファイルの結果に加えて合計が出ます。出力を別コマンドで読む場合はファイル名や合計行も考慮します。
パイプで結果を数える sort -u data.txt | wc -lなら、sortが出した種類ごとの行数を数えます。grepの抽出行数を数えることもできますが、0件がエラーなのか正常な空結果なのかは上流の終了値を別に確認する必要があります。件数だけでは処理の成功を保証できません。
検算手順 一行のASCII、空入力、空行、複数空白、末尾改行なしをprintfで作ります。各バイトと改行位置を紙上で数えてから-l/-w/-cを個別に実行します。文字コードを扱う実験はロケールと入力エンコーディングを明示し、このASCIIの検証と分けます。
図解
重要ポイント
- -lは改行文字の数。
- -wは空白類で区切られた語の数。
- -cはバイト、-mは文字。
- 入力の経路でファイル名や合計行の有無が変わる。
間違えやすい点
- 末尾改行のない最終行を-lが必ず数えると思わない。
- 空白やLFをバイト数から除かない。
- 件数0だけで上流処理が正常だったと判断しない。
用語解説
- 改行数
- LF等の改行文字の出現回数。この実習ではLF。
- バイト
- データの大きさを表す8ビットの単位。
- 単語数
- wcが空白類を区切りとして数える非空白のまとまりの数。
- 標準入力
- パイプやリダイレクトでコマンドへ渡す入力の流れ。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。