DESIGN / CODE / INFRA / AI

解説

二行に見えるのにwc -lは1?末尾の改行と行数を確認しよう

wc -lが数えるのは改行文字。最終行に改行がない場合とある場合を比べ、表示上の折り返しや文字数・バイト数との違いを整理する。

二行に見えるのにwc -lは1?末尾の改行と行数を確認しよう
保存リストを見る →
この記事の道しるべ 5項目

テキストエディターでは二行に見えるのに、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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。