nlコマンドはsオプションを指定することで、行番号と入力行のセパレータ文字列を変更することができます。
sオプションの使い方
まずはマニュアルを参照してみましょう。説明の差はほとんどありません。-s
の後に文字列
を指定することで、セパレータを変更できるようです。そしてデフォルトはタブ
です。
info nl (GNU coreutils)
‘-s STRING’
‘--number-separator=STRING’
Separate the line number from the text line in the output with
STRING (default is the TAB character).
man nl (BSD)
-s sep Specify the characters used in separating the line number and
the corresponding text line. The default sep setting is a sin-
gle tab character.
busybox nl --help
-s STRING Use STRING as line number separator
POSIX
-s sep
Specify the characters used in separating the line number and the corresponding text line. The default sep shall be a <tab>.
出典:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
sオプションを試す
それでは最初の記事で使用したテキストファイル「utl-kita」で実際に試してみましょう。
まずは、セパレータをタブから,
カンマに変更して出力をCSVにしてみます。-wオプションで駅ナンバリング表示したときのコマンド入力を流用します。
$ nl -n rz -w 2 -s , utl-kita | sed 's/^/JU/'
JU01,東京
JU02,上野
JU03,尾久
JU04,赤羽
JU05,浦和
JU06,さいたま新都心
JU07,大宮
これで駅ナンバリング表示のCSVデータを作成することができました。元からあるCSVデータに通し番号のIDを振るときにとても便利なオプションです。
さらに、-sに指定できるのは文字(character)ではなく文字列(string)となっているため、長い文字列を挿入することもできます。
$ nl -n rz -w 2 -s ',宇都宮線・高崎線,' utl-kita | sed 's/^/JU/'
JU01,宇都宮線・高崎線,東京
JU02,宇都宮線・高崎線,上野
JU03,宇都宮線・高崎線,尾久
JU04,宇都宮線・高崎線,赤羽
JU05,宇都宮線・高崎線,浦和
JU06,宇都宮線・高崎線,さいたま新都心
JU07,宇都宮線・高崎線,大宮
路線名の列を簡単に付加することができました。
余談
オプションのデフォルトがタブというのは以外にありがたいことのようにな気がしてきました。というのは、echo -e
のように、nl -s '\t'
としても残念ながらタブと識別されません。
$ nl -s '\t' utl-kita
1\t東京
2\t上野
3\t尾久
4\t赤羽
5\t浦和
6\tさいたま新都心
7\t大宮
ターミナルではCtrl+v
Tab
などと入力すればタブがそのまま入力できるのですが、めったに使わないのでいつも忘れてしまいます。
$ nl -s ' ' utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
「難読化シェル芸」勢の方々は、もっとおもしろいタブの入力をやりそうです。なにかあればまた追記したいと思います。