解説
二行に見えるのにwc -lは1?末尾の改行と行数を確認しよう
wc -lが数えるのは改行文字。最終行に改行がない場合とある場合を比べ、表示上の折り返しや文字数・バイト数との違いを整理する。

テキストエディターでは二行に見えるのに、wc -lの結果は1。最後の行に改行があるかどうかで、結果が変わることがあるよ。見た目の行と、コマンドが数えているものを分けてみよう。
今回はGNU coreutils 9.7とBashを使い、新しい練習フォルダーで二つのファイルを比べる。既存のファイルへ上書きせず、実際のログや個人情報は使わないよ。
末尾の改行だけが違う二つのファイル
printf 'red\nblue' > no-final.txt
printf 'red\nblue\n' > with-final.txt
wc -l no-final.txt with-final.txt
\nは、このprintfでは改行を表す指定。no-final.txtにはredの後の改行が一つ、with-final.txtにはblueの後にも改行があり、合計二つ入る。
期待する表示はno-final.txtが1、with-final.txtが2。複数のファイルを指定したので、合計3の行も出るよ。
wc -lは改行文字の数を数える
GNUのマニュアルは、-lを改行の数として説明している。末尾に改行のない部分は、この数へ追加されない。エディターが表示する最終行の番号と同じになるとは限らないんだ。
また、長い一行が画面幅で三行に折り返されても、ファイル内に改行がなければ改行数は増えない。ウィンドウを広くすると結果が変わるような、見た目の行数を数えるコマンドではないよ。
バイト数でも違いを確かめる
wc -c no-final.txt with-final.txt
今回の内容はASCIIの文字だけなので、期待するバイト数は8と9。redの3、改行の1、blueの4で8。最後の改行があるファイルだけ、さらに1増える。
-cはバイト数で、見える文字の数ではない。日本語など複数バイトで表す文字を含む場合は、文字数と同じになると考えないようにしよう。-mは文字数を数える指定だけれど、解釈する文字コードやロケールにも注意が必要だよ。
データ件数に使う前に、ファイル形式を見る
一行一件で、各行に改行が付くという形式なら、wc -lが件数確認の材料になることはある。ただしCSVの引用符の中に改行があったり、最後だけ改行がなかったりすれば、その前提が変わる。
「wc -lの数字だけ合ったから全レコードが正しい」とは判断できない。形式に合った読み込み方法で数えることと、単純な改行数の確認は別の検査だね。
確認したことと戻し方
編集部では、二つのファイルの実際のバイト列、改行数1・2、バイト数8・9、元ファイルが変わらないことを照合した。作例を戻す場合は、練習場所で最初のprintfを実行し直せるよ。
元データを変えるためだけに、実際の設定ファイルへ改行を追記しないようにしよう。比較したい場合はGit管理外の二つのファイルの差分、CSVの件数は引用符とレコード数も参考にしてね。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。