今年の春に、ある社内ツールをシェルスクリプトと awk で書きました。その時、Cygwin の cat コマンドでちょっとハマった事を思い出したので書いておきます。
改行コード
Debian にて 3 つの改行を含むテキストファイル a.txt を作成。この時、a.txt の改行コードは LF。
dyama@debian:~$ cat > a.txt ^D
nkf で改行コードを CRLF にして b.txt を作成。
dyama@debian:~$ nkf -Lw a.txt > b.txt
もちろん、cat で吐いた文字数は異なります。
dyama@debian:~$ cat a.txt | wc -c 3 dyama@debian:~$ cat b.txt | wc -c 6
この a.txt と b.txt を Windows の Cygwin 環境に持ってきます。(もちろん、自動的に改行コード変換をする FTP ソフトなどは経由せずに)
同じく cat で吐いた文字数を調べようとすると
$ cat a.txt | wc -c 3 $ cat b.txt | wc -c 3
えっ
おそるおそるファイルサイズを調べます。
$ ls -l a.txt b.txt -rw-r--r-- 1 dyama hogehoge 3 Sep 24 17:44 a.txt -rw-r--r-- 1 dyama hogehoge 6 Sep 24 17:44 b.txt
なにこれこわい。
Cygwin のセットアップ時に、改行コードを DOS の CR+LF にするか、UNIX の LF のみにするかを選択する事が出来ますが、どうも Cygwin に添付されている cat コマンドだけは、是が非でも CRLF を改行コードとして入出力するらしいです。
LF 改行なシェルスクリプトの中で cat コマンドを使って、ファイル出力などをやっていたので、見事につまづきました。
さらに、出力したファイルを awk で行パターンマッチさせようとして、全然動いてくれなくて数日悩みました。ほんと、明記しておいて欲しいなあ。
ちなみに、件についてしっかりと書いてあるのは、本日現在、このページくらいでした。ココがなければずっと迷っていたと思います。多謝。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。