TukubaiのMapを使ってみた
手元のデータをKeynoteのグラフ描画のデータに流し込むために表の形式に整形しようと思ったところ、1ツイートに収まらないくらい長く書いてしまいました。そこで
1 A hoge
— Masaki Waga (@MasWag) September 28, 2018
1 B fuga
2 A piyo
2 B pohe
みたいなデータを
A B
1 hoge fuga
2 piyo pohe
みたいにtsvとかで整形するのってもしかしてShellでやるの大変なやつか?(あっさり書けそうで書けてない)
ご存知かもしれませんが、Tukubaiコマンドが使える環境でしたら、mapコマンド使うと出来ますね。https://t.co/SZYtkhmEBF
— ぱぴろんちゃん😱🙀 (@papiron) September 28, 2018
ということでTukubaiのmap を教わったのでTukubaiを良く知らないということの自戒を込めて使ってみました。ちなみにこの原稿はJupyter Notebookのbash_kernelを使って書いています。
環境は以下です。
In [1]:
which map
/usr/local/bin/map
In [2]:
map --help
Usage : map [-<l>] num=<n>x<m> <file>
: map +yarr [-<l>] num=<n>x<m> <file>
: map +arr [-<l>] num=<n>x<m> <file>
Option : -m<c>
: -n
Version : Sat Dec 10 21:04:17 JST 2011
Open usp Tukubai (LINUX+FREEBSD/PYTHON2.4/UTF-8)
基本的な使い方
Tukubaiの基本的な使い方は、
“縦のキー” “横のキー” “データ”
となっているデータを適切な表の形式に整形する、というもののようです。
In [3]:
map num=1 << EOF
1 A hoge
1 B fuga
2 A piyo
2 B pohe
EOF
* A B
1 hoge fuga
2 piyo pohe
欠損しているデータがある場合はデフォルトだと0が与えられます。
In [4]:
map num=1 << EOF
1 A hoge
1 B fuga
2 A piyo
2 B pohe
3 A fugaa
EOF
* A B
1 hoge fuga
2 piyo pohe
3 fugaa 0
欠損データのデフォルト値は -m
オプションで指定することができます。
In [5]:
map -m なし num=1 << EOF
1 A hoge
1 B fuga
2 A piyo
2 B pohe
3 A fugaa
EOF
* A B
1 hoge fuga
2 piyo pohe
3 fugaa なし
インデックスが複数フィールド存在するとき
縦のインデックスが複数フィールド存在するときは num
の値を変更します。
In [6]:
map num=2 << EOF
1年 1組 A hoge
1年 1組 B fuga
1年 2組 A piyo
1年 2組 B pohe
EOF
* * A B
1年 1組 hoge fuga
1年 2組 piyo pohe
横のインデックスが複数フィールド存在するときは以下の様です。
In [7]:
map num=1x2 << EOF
1年 1組 A hoge
1年 1組 B fuga
1年 2組 A piyo
1年 2組 B pohe
EOF
* 1組 1組 2組 2組
* A B A B
1年 hoge fuga piyo pohe
データが複数フィールド存在するとき
データが複数存在するときは新たにA,Bとラベル付けして縦の列に追加してくれます。
In [8]:
map num=1 << EOF
1年 1組 hoge hogee
1年 2組 fuga fugaa
2年 1組 piyo poyoo
2年 2組 pohe pohee
EOF
* * 1組 2組
1年 A hoge fuga
1年 B hogee fugaa
2年 A piyo pohe
2年 B poyoo pohee
ラテン文字ではなく、数値でラベル付けをして欲しいときは -n
オプションを使います。
In [9]:
map -n num=1 << EOF
1年 1組 hoge hogee
1年 2組 fuga fugaa
2年 1組 piyo poyoo
2年 2組 pohe pohee
EOF
* * 1組 2組
1年 1 hoge fuga
1年 2 hogee fugaa
2年 1 piyo pohe
2年 2 poyoo pohee
横のデータを横方向に展開させたいときは +yarr
を付けます。
In [10]:
map +yarr num=1 << EOF
1年 1組 hoge hogee
1年 2組 fuga fugaa
2年 1組 piyo poyoo
2年 2組 pohe pohee
EOF
* 1組 1組 2組 2組
* a b a b
1年 hoge hogee fuga fugaa
2年 piyo poyoo pohe pohee
+yarr
を付けた場合も -n
で数値でラベル付けることができます。
In [11]:
map +yarr -n num=1 << EOF
1年 1組 hoge hogee
1年 2組 fuga fugaa
2年 1組 piyo poyoo
2年 2組 pohe pohee
EOF
* 1組 1組 2組 2組
* 1 2 1 2
1年 hoge hogee fuga fugaa
2年 piyo poyoo pohe pohee
同様a,bのラベル付けが不要なときは +arr
を付けます。
In [12]:
map +arr num=1 << EOF
1年 1組 hoge hogee
1年 2組 fuga fugaa
2年 1組 piyo poyoo
2年 2組 pohe pohee
EOF
* 1組 1組 2組 2組
1年 hoge hogee fuga fugaa
2年 piyo poyoo pohe pohee
一行のデータを複数に区切る方法
-<数値>
オプションを使うことで、データをよしなに区切ることもできます。
In [13]:
map -3 num=1 << EOF
X x 1 2 3 4 5 6
X y 7 8 9 A B C
Y x D E F G H I
Y y J K L M N O
EOF
* * x x y y
* * a b a b
X A 1 4 7 A
X B 2 5 8 B
X C 3 6 9 C
Y A D G J M
Y B E H K N
Y C F I L O
但し欠損データの補完はできない様です。
In [14]:
map -3 num=1 << EOF
X x 1 2 3 4 5 6
X y 1 2 3 4 5
Y x 1 2 3 4 5 6
Y y 1 2 3 4 5 6
EOF
Error[map] : フィールドが足りません。
結論
Tukubaiは便利