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
$

横インデックスが不要な場合には+arrオプションを使用する。

$ 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
$

【関連項目】

unmap(1)tateyoko(1)

Last modified: 2022-08-13 08:42:35