algonote

There's More Than One Way To Do It

シェル芸代替ツールとしてのrbコマンド

rbコマンド布教してみる

f:id:hiromichinomata:20190829033452p:plain:w200

前口上

ワンライナーですませられる文字列操作をする際、古典的にはawkやsed, Perlを使っていることが多い。いわゆるシェル芸と称されるbashの組み込み機能だけで実現する文字列操作は個々のコマンドの役割が小さいためパイプが長くなってしまいがちで、記法自体にlegacyさが残っており多少のつらみを感じる時もある。

rbコマンドはRubyでワンライナーを実現するための簡単なスニペットであり、pure Rubyさえ知っていれば誰でも使えるので布教してみる。

インストール

rbのGitHubに従う。コマンドの実体は9行のRubyコード

sudo curl https://raw.githubusercontent.com/thisredone/rb/master/rb -o /usr/local/bin/rb && sudo chmod +x /usr/local/bin/rb

使い方

基本はrbに渡すだけで渡したオブジェクトがサポートする任意のRubyメソッドが使える。オプションなしで渡すと文字列の塊が、-l を渡すと行ごとに処理が行われる。 str.reversestrが省略されているイメージ。

> ls
a.md  b.md  c.md

## まとめて
> ls |rb  'reverse'
c.md
b.md
a.md

## 行ごと
> ls |rb -l 'reverse'
dm.a
dm.b
dm.c

シンプルなCSV

特定の列を抜く

> cat example.csv
id,name,age,sex
1,Taro,17,male
2,Hanako,29,female
3,Ken,35,male
4,Ai,7,female

> cat example.csv |rb -l 'split(",")[2]'
age
17
29
35
7

csvからヘッダー除去

> cat example.csv |rb 'drop(1)'
1,Taro,17,male
2,Hanako,29,female
3,Ken,35,male
4,Ai,7,female

特定列でソート

> cat example.csv |rb 'drop(1).sort_by{|l| l.split(",")[2].to_i}'
4,Ai,7,female
1,Taro,17,male
2,Hanako,29,female
3,Ken,35,male

Future Work

jsonのツールについても書きたい

github.com