はじめに
Hello Worldと書かれたテキストファイルを画面に表示した際、以下のように終端が改行されずにプロンプトが表示されることがあります。
root@instance-1:~$ cat hoge.txt Hello Worldroot@instance-1:~
このようなファイルは、改行無し終端テキストと呼ばれるようです。ちなみに、英語だと改行コードをnewline character、終端文字をterminal's character と呼びます。
このような改行無し終端テキストに対して行数を取得するwcコマンドを利用する際に気を付ける必要があります。
コマンド実行環境
- Debian GNU/Linux 9 (stretch)
発生する事象
ファイルの制御コードを確認
例えばLinux上で作成したテキストファイル
Hello
Wolrd
といったファイルをcat -e
で表示すると
$ cat -e hello.txt Hello$ World$
といったように行末に$が挿入されて見えます。
とろこが終端に改行無しのファイルは以下のようになっていたりします。
cat -e hello2.txt Hello^M$ World
これはWindowsで作られたファイルであったり原因は多岐に渡りますが行末に制御コードが確認できないはずです。
行末に改行コードが入っていないファイルの行数取得
例えばcatコマンドで行数を表示しながらテキストを確認すると改行無し終端テキストでも
$ cat -n hello2.txt 1 Hello 2 World
といったように行数が正しく見えますがwcコマンドで行数を取得すると
$ cat -n hello2.txt | wc -l 1
数字が一つ少ない状態で行数が取得されてしまいます。
終わりに
以下のようにwcコマンドを利用してテキストファイルを捌くシェルスクリプトを書くこともあるかと思います。
その際に不具合が発生することがあれば、本記事が原因の可能性があるので頭の片隅に入れておくとどこかで役立つやもしれません。
以上、ご参考になれば幸いです。