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)。
で、なんか値を出力するにはtee
、print
、emit
、dump
の4つがあって、さらにemit
にはemitf
、emitp
みたなバリエーションがある。けど違いがよくわからない。
$name
はname
フィールドを示している。$*
はすべてのフィールド。
>
はリダイレクト。シェルと同じで>>
とか|
もある。
.
は文字列を結合する。なので、$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.