(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【wcコマンド】改行無し終端テキストに対する注意点

スポンサーリンク

はじめに

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コマンドを利用してテキストファイルを捌くシェルスクリプトを書くこともあるかと思います。

その際に不具合が発生することがあれば、本記事が原因の可能性があるので頭の片隅に入れておくとどこかで役立つやもしれません。
以上、ご参考になれば幸いです。