直近はRubyKaigiだったりでRubyを書くことが多かったのでGoがご無沙汰だったので素振りをするためにGoでLTSVをJSONに変換するコマンドラインツールを作成した
なんで作ったの?
使い方
README.mdにも記載している
インストールは go get github.com/hatappi/ltsv2json
でも良いし https://github.com/hatappi/ltsv2json/releases にMacOS, Linux用のバイナリを置いている
使い方はシンプル
こんな感じのLTSVフォーマットのファイルを /tmp/fruits.ltsv
として用意する
name:grape num:10 name:apple num:3 name:banana num:5 name:orange num:2
LTSV2JSONは標準入力とファイル指定どちらも対応している
標準入力
$ cat /tmp/fruits.ltsv | ltsv2json [{"name":"grape","num":10},{"name":"apple","num":3},{"name":"banana","num":5},{"name":"orange","num":2}]
ファイル指定
$ ltsv2json -i /tmp/fruits.ltsv [{"name":"grape","num":10},{"name":"apple","num":3},{"name":"banana","num":5},{"name":"orange","num":2}]
後はパイプでjqにつないであげれば、自由に調理できる
# 個数をすべて集計 $ cat /tmp/fruits.ltsv | ltsv2json | jq -c '[.[] | .num] | add' 20 # バナナの個数を表示 $ cat /tmp/fruits.ltsv | ltsv2json | jq -c '.[] | select(.name == "banana") | .num' 5
tail -f みたいな機能
今書いた例は標準入力やファイルを指定してJSONで出力して終わりだけど、tail -f
のように新しく追記されたら、それをJSONで出力するようにしたい
LTSV2JSONは-f
をつけることでそれが可能になるようにしている
$ ltsv2json -i /tmp/fruits.ltsv -f {"name":"apple num:3"} {"name":"banana num:5"} {"name":"orange num:2"} # 別のセッションで追記する $ echo "name:grape\tnum:10" >> /tmp/fruits.ltsv # JSONに変換されて出力される $ ltsv2json -i /tmp/fruits.ltsv -f {"name":"apple num:3"} {"name":"banana num:5"} {"name":"orange num:2"} {"name":"grape","num":10}