LoginSignup
0
0

More than 3 years have passed since last update.

行番号の増加値を変更するnlコマンドのiオプション

Posted at

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ではマッチしなかった行がフィルタされてしまうので、印だけをつけて全体を出力したいときに便利かもしれません。特に-i0を指定すれば印になる数値を固定することができるので、ANSIカラーコードで色付けするのとも違って、後段の処理で行を識別するのが容易になると考えています。
前回の記事で利用したテキストファイル「yokohamaline」の駅名のうち、4文字以上の駅に印をつけてみます。

BSD
$ nl -v 0 -i 0 -b p'.\{4,\}' yokohamaline
     0  東神奈川
        大口
        菊名
        新横浜
        小机
        鴨居
        中山
     0  十日市場
        長津田
        成瀬
        町田
        古淵
        淵野辺
        矢部
        相模原
        橋本
        相原
     0  八王子みなみ野
        片倉
        八王子

nlで快速停車駅だけを識別する

正規表現をがんばれば快速停車駅だけに印をつけることもできます。

BSD
$ nl -w 1 -v 0 -i 0 -b p'[川山菊新鴨田相橋八片]' yokohamaline | nl -w 1 -i 0 | tr '01' '快各' | expand
各      快      東神奈川
各              大口
各      快      菊名
各      快      新横浜
各              小机
各      快      鴨居
各      快      中山
各              十日市場
各      快      長津田
各              成瀬
各      快      町田
各              古淵
各              淵野辺
各              矢部
各      快      相模原
各      快      橋本
各      快      相原
各      快      八王子みなみ野
各      快      片倉
各      快      八王子

trは文字の置き換えるコマンドで、数値を「各」「快」といった文字に変換しています。expandはタブをスペースに変換するコマンドで、Qiita上できれいに表示するために加えています。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0