MillerでCSVファイルを分割

こうすればできることはわかったけど…

$ echo -e 'name,value\na,1\na,2\nb,3\nc,10\nb,6' |\
     mlr --csv put 'tee > $name . ".txt", $*'
name,value
a,1
a,2
b,3
c,10
b,6

$ ls
a.txt  b.txt  c.txt

$ cat a.txt
name,value
a,1
a,2

ドキュメントを呼んでもさっぱり文法がわからない。。

putは、dplyrのmutate()から更に進化して、DSLを書いてなんでもできる、みたいなやつ(ドキュメント:Reference: Verbs)。

で、なんか値を出力するにはteeprintemitdumpの4つがあって、さらにemitにはemitfemitpみたなバリエーションがある。けど違いがよくわからない。

$namenameフィールドを示している。$*はすべてのフィールド。

>はリダイレクト。シェルと同じで>>とか|もある。

.は文字列を結合する。なので、$name.".txt"<フィールド名>.txtになる。

ここまではいいけど、,の意味がさっぱりわからない。,のあとに出力するフィールドを指定するっぽいけど、その文法どこに書いてあるの??

とりあえずこのあたりで断念。

余談

|は黒魔術的で、

... | "jq .[]"

みたいなことをすると、jqコマンドを呼び出してそこに値を渡せるらしい。任意のコードが実行できるのか…。poweroffとかできちゃうのか…なにそれこわい…

$ echo -e 'name,value\na,1\na,2\nb,3\nc,10\nb,6' | mlr --icsv  put 'tee | "poweroff", $*'
name=a,value=1
name=a,value=2
name=b,value=3
name=c,value=10
name=b,value=6
Failed to set wall message, ignoring: Interactive authentication required.
Failed to power off system via logind: Interactive authentication required.
Failed to start poweroff.target: Interactive authentication required.
See system logs and 'systemctl status poweroff.target' for details.
Failed to open /dev/initctl: Permission denied
Failed to talk to init daemon.