NT版UNIX-like toolsのtail, wcは、最後の行が改行で終わっていない場合、最後の行を1行としてカウントしません。
この動作は、UNIXの同名のコマンドの動作に合わせたもので、仕様です。
従って、この動作を変更することはありません。
回避方法 (2006年5月29日差し替え、OOTANI TAKASHIさんに感謝) §
(Windows付属の)moreを使うと全ての行に改行を付けることができます。
wcは単純にmoreを前段に付けるだけで回避できます。
たとえば、以下のようなコマンドを使うと、ファイルbad.txtの全ての行に改行が強制的に付加され、最後の行も1行としてカウントされます。
何らかのコマンドの入力を受け取るなら以下のように使います。
ちなみに、moreはファイルやパイプを出力対象としたとき、入力待ちになることはありません。
tailは残念ながらこの方法では回避できません。たとえば、以下のような方法で一時ファイルに書き出し、それを対象に処理する方が良さそうです。(tailは後ろからテキストを調べる関係上、ランダムアクセスできる対象=つまりファイルを相手に実行する方が良い)
more <bad.txt >tempfile.$$$
tail tempfile.$$$
del tempfile.$$$
説明 §
このことは、原作者の作成したtailのドキュメントに以下のように記載されています。
最後が改行で終わっていないファイルに対し「tail -行数 ファイル名」
を実行すると、最後の行が行数に数えられないため、出力が指定より1行
多くなる。これは、UNIXのtailに合わせてわざとそうしてある。
wcに関しては、ドキュメントに明示されていませんが、FreeBSDのwcが同様に最後の行をカウントしないことを確認しました。
ちなみにFreeBSDを使ったのは、基本コマンドについて、より強力な別ツールへの置き換えがあまり行われていないだろう……という(あまり根拠のない)判断によるものです。