nlコマンドはnオプションを指定することで、行番号のフォーマットを変更することができます。変更できる書式は「左詰め」「右詰め」「ゼロ埋め」の3つです。
#nオプションの使い方
まずはマニュアルを参照してみましょう。
info nl (GNU coreutils)
‘-n FORMAT’
‘--number-format=FORMAT’
Select the line numbering format (default is ‘rn’):
‘ln’
left justified, no leading zeros;
‘rn’
right justified, no leading zeros;
‘rz’
right justified, leading zeros.
man nl (BSD)
-n format Specify the line numbering output format. Recognized format
arguments are:
ln Left justified.
rn Right justified, leading zeros suppressed.
rz Right justified, leading zeros kept.
The default format is rn.
つまり、-n
の後に
ln:左詰め
rn:右詰め(デフォルト)
rz:右詰めゼロ埋め
のいずれかを指定すればいいことがわかりますね。-n
を指定しないときは-n rn
が指定されたのと同じ動きになります。また、coreutilsのnl
ではロングオプション形式もサポートしており-n ln
を--number-format=ln
と指定することもできます。わざわざ長いオプションを書くのは面倒ですが、何のオプションなのか明確になるので可読性は向上します。
そしてマニュアルを読む限りにおいて、これら2つの実装は-n
の機能差はありません。しかしbusyboxのnl
は残念ながら-n
のオプションそのものをサポートしていません。
POSIX
せっかくなので、フォーマットに関しては標準ドキュメントであるPOSIX(IEEE Std 1003.1-2017)も眺めてみましょう。
STDOUT
The standard output shall be a text file in the following format:
"%s%s%s", <line number>, <separator>, <input line>
where <line number> is one of the following numeric formats:
%6d
When the rn format is used (the default; see -n).
%06d
When the rz format is used.
%-6d
When the ln format is used.
<empty>
When line numbers are suppressed for a portion of the page; the is also suppressed.
In the preceding list, the number 6 is the default width; the -w option can change this value.
出典:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
C言語のフォーマット指定子によって、出力は<line number>
<separator>
<input line>
の3つの文字列の組み合わせ%s%s%s
であると記載されています。そして、<line number>
は%6d
%06d
%-6d
といずれも10進の符号付き整数であり、デフォルトでは6桁となっているようです。
nオプションを試す
前置きが少々長くなってしまいましたが、それでは最初の記事で使用したテキストファイル「utl-kita」で実際に試してみましょう。
左詰め
$ nl -n ln utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
右詰め(デフォルト)
$ nl -n rn utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
$ nl utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
ゼロ埋め
$ nl -n rz utl-kita
000001 東京
000002 上野
000003 尾久
000004 赤羽
000005 浦和
000006 さいたま新都心
000007 大宮
しっかり6桁であることも確認できました。
余談
なぜフォーマットにlz
「左詰めゼロ埋め」が存在しないのでしょうか、一瞬考えてしまいました。
100
を6桁で左詰めゼロ埋めすると100000
になりますね。ぜひ銀行口座の残高などで積極的に使ってほしい書式です。