sel
コマンドを知っていますか?カラムを取り出すことに注目したコマンドで、cut
とawk
のちょうど間ぐらいの使い心地を目指して私がちまちま作っているものですね。
他の似たツールとして self や choose があります。
基本的な使い方
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
これに対応するために、awk
のFPAT
のようなものを実装しようと考えましたが、面倒だしバグらせる自信があるし、なにより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
のように数値計算したりはできません。
正直この機能を実装するかどうか結構悩みました。機能過多だと思ったからです。機能が増えるとそれだけメンテするコストが上がってしまうので面倒です。
でも結局実装しました。便利だし、モチベであるcut
とawk
のちょうど間ぐらいの機能として違和感はなかったからです。
まとめ
今回は最近sel
に追加したcsv/tsv
オプションとtemplate
オプションについて書きました。
個人的に結構気に入ってるコマンドなので、ぜひ使ってみて貰えると嬉しいです。Goがインストールされていれば go install
を通じてインストールできます。Goがない場合でも GitHub Releasesからお好みのバイナリをダウンロードすることができます。
# install
$ go install github.com/xztaityozx/sel@latest
以上です。
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | 終 | | 制作・著作 | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | xztaityozx | |_________| ∧∧ || ( ゚д゚)|| / づΦ
付録
- https://www.slideshare.net/xztaityozx/ocssel
- はじめて話したときのスライド
self
という先行研究があることを知りその場で膝から崩れ落ちた
- https://www.slideshare.net/xztaityozx/sel-250560885
- 2回目の挑戦
- 先行研究を研究し、速度と機能の面から攻めたときの話