2018年9月29日土曜日

TukubaiのMapを使ってみた

手元のデータをKeynoteのグラフ描画のデータに流し込むために表の形式に整形しようと思ったところ、1ツイートに収まらないくらい長く書いてしまいました。そこで

というツイートをしたところ、@papiron さんから

ということでTukubaiのmap を教わったのでTukubaiを良く知らないということの自戒を込めて使ってみました。ちなみにこの原稿はJupyter Notebookbash_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は便利