シェルスクリプトの記事の動作チェックをしていた時に、BSDのuniq(1)の出力がPOSIXに準拠していないことに気がついた。
% jot -b 1 100 | uniq -c
100 1
SUSv3のOUTPUT FILESの節には、次のように書いてある。
If the -c option is specified, the output file shall be empty or each line shall be of the form:
"%d %s", <number of duplicates>, <line>
BSDのコードは昔から"%4d %s"
だ。この書式指定は少なくとも1980年まで遡ることができる。ずっと変わっていない。確認してみたところ Solarisの実装 も "%4d"
だ。SCO UNIX はソースが確認できないが動作を調べると"%4d"
っぽい。
古いUNIXのソースを遡ってみると4th Editionまで遡ることができた。1975年5月のソースだが、これも"%4d"
だ。
一方GNU coreutils (確認したバージョンはuniq 8.4)は次のように表示する。
100 1
ソースファイルを確認する限りでは"%7" PRIuMAX
のようだ。Gitの履歴からたどれるもっとも古い1992年11月のバージョンでは"%7d"
になっている。ということは、POSIXを信じてuniq -c | cut -f 1 -d " "
とかすると痛い目をみる、ということだろうか。
uniq -c
の出力が%d
になっている環境を知っている方、情報求む。