たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

sel の csv/tsv オプションと template オプションの話

selコマンドを知っていますか?カラムを取り出すことに注目したコマンドで、cutawkのちょうど間ぐらいの使い心地を目指して私がちまちま作っているものですね。

github.com

他の似たツールとして selfchoose があります。

基本的な使い方

selはカラムを選択するだけのプログラムです。カラムは1始まりの数値で選択します。0は行全体を表します。

$ cat ./file
1 2 3 4 5 6
a b c d e f

# 1 ~ 3カラム目を取り出す
$ cat ./file | sel 1 2 3
1 2 3
a b c

# 0は行全体
$ cat ./file | sel 0
1 2 3 4 5 6
a b c d e f

負のインデックスを指定することで「後ろから何番目」を表すこともできます。

# 後ろから1番目のカラムを取り出す
$ cat ./file | sel -- -1
6
f

また、単一のカラムだけでなく、範囲指定することができます。(これがこのコマンドで一番やりたかったことでもあります)

# 1 ~ 3カラム目を取り出す
$ cat ./file | sel 1:3
1 2 3
a b c

基本的な使い方は以上です。もっと詳しく使い方を説明したいところですが、それはREADMEを読んでいただくこととし、この記事では最近追加した新機能2種について書こうと思います。

csv/tsv オプション

sel v1.1.9ちゃんとしたCSVとTSVがサポートされました。
今までも入力文字列のデリミターを-d, --input-delimiterオプションを通じて変更できたので、-d,とすれば使えたのですが hoge,"fuga,piyo",bar というようなデータをちゃんと処理できない状態でした。

# CSVの2カラム目としては `fuga,piyo` が正しいが、`-d,`では `"fuga` になってしまう
$ echo 'hoge,"fuga,piyo",bar' | sel -d, 2
"fuga

これに対応するために、awkFPATのようなものを実装しようと考えましたが、面倒だしバグらせる自信があるし、なによりFPATは気軽に書けないので Goのencoding/csvパッケージを使って入力を読み取るオプションを搭載することにしました。それが--csvオプションです。

$ echo 'hoge,"fuga,piyo",bar' | sel --csv 2
fuga,piyo

ついでにTSVもサポートしました。--tsvオプションを通じて利用することができます。

ところで、最近awkでもcsvがサポートされました。便利ですね。

template オプション

sel v1.1.10で、出力文字列のフォーマットを指定できる -t, --templateオプションを追加しました。

いままではシンプルに選択されたカラムが出力されるだけでしたが、--templateオプションの追加で以下のような出力ができるようになりました。

$ echo AAA BBB CCC | sel --template '1: {} 2: {} 3: {}' 1:3 
1: AAA 2: BBB 3: CCC

テンプレート内にプレースホルダ{}を書くと、そこへ選択したカラムを順番に割り当てることができます。それだけです。awkのように数値計算したりはできません。

正直この機能を実装するかどうか結構悩みました。機能過多だと思ったからです。機能が増えるとそれだけメンテするコストが上がってしまうので面倒です。 でも結局実装しました。便利だし、モチベであるcutawkのちょうど間ぐらいの機能として違和感はなかったからです。

まとめ

今回は最近selに追加したcsv/tsvオプションとtemplateオプションについて書きました。

個人的に結構気に入ってるコマンドなので、ぜひ使ってみて貰えると嬉しいです。Goがインストールされていれば go installを通じてインストールできます。Goがない場合でも GitHub Releasesからお好みのバイナリをダウンロードすることができます。

# install
$ go install github.com/xztaityozx/sel@latest

以上です。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|        終        |
|    制作・著作    |
|   ̄ ̄ ̄ ̄ ̄ ̄ ̄  |
|    xztaityozx    |
|_________|
  ∧∧   ||         
  ( ゚д゚)||           
  /    づΦ         

付録