nlコマンドはiオプションを指定することで、行番号の増加値を変更することができます。
iオプションの使い方
増加値を変更します。デフォルトは1
です。マニュアルを参照してみましょう。
info nl (GNU coreutils)
‘-i NUMBER’
‘--line-increment=NUMBER’
Increment line numbers by NUMBER (default 1).
busybox nl --help
-i N Line number increment
man nl (BSD)
-i incr Specify the increment value used to number logical page lines.
The default incr value is 1.
POSIX
-i incr
Specify the increment value used to number logical page lines. The default shall be 1.
iオプションを試す
それでは実際に試してみましょう。
$ yes | nl -i 2 | head
1 y
3 y
5 y
7 y
9 y
11 y
13 y
15 y
17 y
19 y
$ yes | nl -v 2 -i 2 | head
2 y
4 y
6 y
8 y
10 y
12 y
14 y
16 y
18 y
20 y
奇数だけとか偶数だけとかにできますが、「行番号」としてどんな使い方があるのかはあまり想像がついていません。paste
やプロセス置換などと組み合わせて、データを横に並べたいときなどには使えるかもしれませんね。
$ paste <(yes | nl -n rz -w 2 -s , -i 2 | head) <(yes | nl -n rz -w 2 -s , -v 2 -i 2 | head)
01,y 02,y
03,y 04,y
05,y 06,y
07,y 08,y
09,y 10,y
11,y 12,y
13,y 14,y
15,y 16,y
17,y 18,y
19,y 20,y
-i
で利用できる整数の範囲
-i
に与えることのできる整数には実装ごとに差があるので注意が必要です。
実装 | 負の値 | ゼロ | 正の値 |
---|---|---|---|
GNU coreutils(v8.32) | × | × | ○ |
busybox(v1.31.1) | × | ○ | ○ |
BSD(macOS Catalina) | ○ | ○ | ○ |
coreutilsのnl
の新機能
BSD系のnl
ではもともと実装されていた機能ですが、coreutilsのnl
にも-i
に負の値を指定し、デクリメントができる機能が追加されました。2020年10月にソース修正が入ったので、次版以降(v8.33?)で有効になる見込みです。
nl --line-increment can now take a negative number to decrement the count.
これは従来から負の値が利用できるvオプションと一貫性を持たせる意図もあり、各オプションで有効な値の範囲がinfoのマニュアルにも明記される予定です。
nl
で正規表現マッチした行に印をつける
現時点ではBSD系のnl
でしかできませんが、-v
、-b pBRE
と組み合わせると、条件にマッチする行をラベリングしていくことができます。grep
ではマッチしなかった行がフィルタされてしまうので、印だけをつけて全体を出力したいときに便利かもしれません。特に-i
で0
を指定すれば印になる数値を固定することができるので、ANSIカラーコードで色付けするのとも違って、後段の処理で行を識別するのが容易になると考えています。
前回の記事で利用したテキストファイル「yokohamaline」の駅名のうち、4文字以上の駅に印をつけてみます。
$ nl -v 0 -i 0 -b p'.\{4,\}' yokohamaline
0 東神奈川
大口
菊名
新横浜
小机
鴨居
中山
0 十日市場
長津田
成瀬
町田
古淵
淵野辺
矢部
相模原
橋本
相原
0 八王子みなみ野
片倉
八王子
nl
で快速停車駅だけを識別する
正規表現をがんばれば快速停車駅だけに印をつけることもできます。
$ nl -w 1 -v 0 -i 0 -b p'[川山菊新鴨田相橋八片]' yokohamaline | nl -w 1 -i 0 | tr '01' '快各' | expand
各 快 東神奈川
各 大口
各 快 菊名
各 快 新横浜
各 小机
各 快 鴨居
各 快 中山
各 十日市場
各 快 長津田
各 成瀬
各 快 町田
各 古淵
各 淵野辺
各 矢部
各 快 相模原
各 快 橋本
各 快 相原
各 快 八王子みなみ野
各 快 片倉
各 快 八王子
tr
は文字の置き換えるコマンドで、数値を「各」「快」といった文字に変換しています。expand
はタブをスペースに変換するコマンドで、Qiita上できれいに表示するために加えています。