Tukubaiオンラインコマンドマニュアル - map(1)
map(1)
【名前】
map
: 縦型ファイルを縦キー/横キー形式の表に変換
【書式】
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 Sep 19 23:49:25 JST 2020 Edition : 1
【説明】
引数のファイルまたは標準入力のテキストデータが縦キーフィールド<n>
個、横キーフィールド<m>
個(未指定時m=1
)、残りがデータフィールドであると仮定し、データを表に並べて出力する。表に展開することでデータの欠落が発生する場合は0で補完する。補完する文字は-m
オプションで変更できる。
【例1】
縦型データをmap(1)するには次のようにコマンドを実行する。num=<n>
の値は縦キーのフィールド数を表す。この例ではnumの値は縦キーの最後のフィールドを指し示す2を指定する必要がある。
$ cat data 001 a店 01/01 103 ←縦キー 縦キー 横キー データ部 001 a店 01/02 157 002 b店 01/01 210 002 b店 01/02 237 $
$ map num=2 data | keta * * 01/01 01/02 001 a店 103 157 002 b店 210 237 $
【例2】
データに欠落がある場合、データが存在しない場所に値0が補完される。
$ cat data 001 a店 01/01 103 002 b店 01/02 237 $
$ map num=2 data | keta * * 01/01 01/02 001 a店 103 0 002 b店 0 237 $
【例3】
データ部が複数列ある場合には複数行にマッピングが実施される。この時、各行にはA BC ...と順にインデックスが追加される。
$ cat data a店 1日目 103 62 ←縦キー 横キー 売数 客数 a店 2日目 157 94 a店 3日目 62 30 a店 4日目 131 84 ・ ・ d店 6日目 98 69 d店 7日目 101 90 $
$ map num=1 data | keta * * 1日目 2日目 3日目 4日目 5日目 6日目 7日目 a店 A 103 157 62 131 189 350 412 a店 B 62 94 30 84 111 20 301 b店 A 210 237 150 198 259 421 589 b店 B 113 121 82 105 189 287 493 c店 A 81 76 38 81 98 109 136 c店 B 52 49 21 48 61 91 110 d店 A 75 72 34 74 91 98 101 d店 B 48 42 19 43 51 69 90 $
【例4】
例2の結果をさらにsed(1)コマンドでAを売数、Bを客数に置換すると次のような表になる。
$ map num=1 data | sed -e 's/A/売数/1' -e 's/B/客数/1' | keta * * 1日目 2日目 3日目 4日目 5日目 6日目 7日目 a店 売数 103 157 62 131 189 350 412 a店 客数 62 94 30 84 111 20 301 b店 売数 210 237 150 198 259 421 589 b店 客数 113 121 82 105 189 287 493 c店 売数 81 76 38 81 98 109 136 c店 客数 52 49 21 48 61 91 110 d店 売数 75 72 34 74 91 98 101 d店 客数 48 42 19 43 51 69 90 $
【例5】
+yarr
オプションを指定することでデータ部の複数列を横に展開することができる。
$ map +yarr num=1 data | keta * 1日目 1日目 2日目 2日目 3日目 3日目 -- 7日目 7日目 * a b a b a b -- a b ←自動的に追加される a店 103 62 157 94 62 30 -- 412 301 b店 210 113 237 121 150 82 -- 589 493 c店 81 52 76 49 38 21 -- 136 110 d店 75 48 72 42 34 19 -- 101 90 $
$ map +yarr num=1 data | sed -e '2s/a/売数/g' -e '2s/b/客数/g' | keta * 1日目 1日目 2日目 2日目 3日目 3日目 -- 7日目 7日目 * 売数 客数 売数 客数 売数 客数 -- 売数 客数 a店 103 62 157 94 62 30 -- 412 301 b店 210 113 237 121 150 82 -- 589 493 c店 81 52 76 49 38 21 -- 136 110 d店 75 48 72 42 34 19 -- 101 90 $
横インデックスが不要な場合には+a
rr
オプションを使用する。
$ map +arr num=1 data | keta * 1日目 1日目 2日目 2日目 3日目 3日目 -- 7日目 7日目 a店 103 62 157 94 62 30 -- 412 301 b店 210 113 237 121 150 82 -- 589 493 c店 81 52 76 49 38 21 -- 136 110 d店 75 48 72 42 34 19 -- 101 90 $
【例6】
-m
オプションで補完文字を指定できる。デフォルトは0。
$ cat data A a 1 A b 2 B a 4 $
$ map -m@ num=1 data * a b A 1 2 B 4 @ $
【例7】
-<数値>
オプションを妻うことで<数値>
フィールド分ずつmap(1)を実施することができる。<数値>
はデータ部のフィールド数の約数である必要がある。
$ cat data X x 1 2 3 4 5 6 ←データ部を1 2 3と4 5 6というように3つずmapしたい X y 1 2 3 4 5 6 Y x 1 2 3 4 5 6 Y y 1 2 3 4 5 6 $
$ map -3 num=1 data ←3フィールド分ずmap(1)する * * x x y y * * a b a b X A 1 4 1 4 X B 2 5 2 5 X C 3 6 3 6 Y A 1 4 1 4 Y B 2 5 2 5 Y C 3 6 3 6 $
$ map +yarr -3 num=1 data ←+yarrの場合、3フィールド分ずつ折り返し * * x x x y y y * * a b c a b c X A 1 2 3 1 2 3 X B 4 5 6 4 5 6 Y A 1 2 3 1 2 3 Y B 4 5 6 4 5 6 $
【例8】
で縦キーnum=<n>
x<m><n>
個、横キー<m>
個にすることができる。横キーはヘッダー<m>
行に展開される。
$ cat data X1 Y1 Z1 1 8 X1 Y1 Z2 2 7 X1 Y2 Z1 3 6 X1 Y2 Z2 4 5 X2 Y1 Z1 5 4 X2 Y1 Z2 6 3 X2 Y2 Z1 7 2 X2 Y2 Z2 8 1 $
$ map num=1x2 data * * Y1 Y1 Y2 Y2 ←横ヘッダーが2行になる * * Z1 Z2 Z1 Z2 X1 A 1 2 3 4 X1 B 8 7 6 5 X2 A 5 6 7 8 X2 B 4 3 2 1 $
$ map +yarr num=1x2 data * Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 ←横ヘッダーが2行になる * Z1 Z1 Z2 Z2 Z1 Z1 Z2 Z2 * a b a b a b a b X1 1 8 2 7 3 6 4 5 X2 5 4 6 3 7 2 8 1 $
【例9】
-<数字>オプションと
を組み合わせると次のように動作する。num=<n>
x<m>
$ cat data3 X1 Y1 Z1 1 8 4 5 6 7 X1 Y1 Z2 2 7 4 5 6 7 X1 Y2 Z1 3 6 4 5 6 7 X1 Y2 Z2 4 5 4 5 6 7 X2 Y1 Z1 5 4 4 5 6 7 X2 Y1 Z2 6 3 4 5 6 7 X2 Y2 Z1 7 2 4 5 6 7 X2 Y2 Z2 8 1 4 5 6 7 $
$ map -3 num=1x2 data3 * * Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 * * Z1 Z1 Z2 Z2 Z1 Z1 Z2 Z2 * * a b a b a b a b X1 A 1 5 2 5 3 5 4 5 X1 B 8 6 7 6 6 6 5 6 X1 C 4 7 4 7 4 7 4 7 X2 A 5 5 6 5 7 5 8 5 X2 B 4 6 3 6 2 6 1 6 X2 C 4 7 4 7 4 7 4 7 $
$ map +yarr -3 num=1x2 data3 * * Y1 Y1 Y1 Y1 Y1 Y1 Y2 Y2 Y2 Y2 Y2 Y2 * * Z1 Z1 Z1 Z2 Z2 Z2 Z1 Z1 Z1 Z2 Z2 Z2 * * a b c a b c a b c a b c X1 A 1 8 4 2 7 4 3 6 4 4 5 4 X1 B 5 6 7 5 6 7 5 6 7 5 6 7 X2 A 5 4 4 6 3 4 7 2 4 8 1 4 X2 B 5 6 7 5 6 7 5 6 7 5 6 7 $
【例10】
-n
オプションを指定すると、付加するインデックスが数値になる。-n
を付けない場合にはアルファベットwが使われるのでインデックス数が26個までという制限があるが、-n
を指定した場合にはインデックスが26個に制限されず、データ部が多い場合もマップすることができる。
$ cat data4 X1 Y1 A1 A2 A3 A4 -- A99 A100 X1 Y2 B1 B2 B3 B4 -- B99 B100 X1 Y3 C1 C2 C3 C4 -- C99 C100 $
$ map -n num=1 data4 * * Y1 Y2 Y3 X1 1 A1 B1 C1 X1 2 A2 B2 C2 ・ ・ X1 29 A99 B99 C99 X1 30 A100 B100 C100 $