UEC - UNIXを深く理解し、シェルプログラミングを極めるコミュニティサイト

- Tukubaiマニュアル
  - cgi-name(1)
  - check_attr_name(1)
  - check_need_name(1)
  - comma(1)
  - count(1)
  - ctail(1)
  - delf(1)
  - divsen(1)
  - getfirst(1)
  - getlast(1)
  - gyo(1)
  - han(1)
  - join0(1)
  - join1(1)
  - join2(1)
  - juni(1)
  - kasan(1)
  - keta(1)
  - keycut(1)
  - loopj(1)
  - loopx(1)
  - map(1)
  - marume(1)
  - mdate(1)
  - mime-read(1)
  - mojihame(1)
  - nameread(1)
  - plus(1)
  - rank(1)
  - ratio(1)
  - retu(1)
  - self(1)
  - sm2(1)
  - sm4(1)
  - sm5(1)
  - tarr(1)
  - tateyoko(1)
  - tcat(1)
  - unmap(1)
  - up3(1)
  - yarr(1)
  - ycat(1)
  - yobi(1)
  - ysum(1)
  - zen(1)
  - タグ形式(5)
  - ネーム形式(5)
  - フィールド形式(5)

# Tukubaiオンラインコマンドマニュアル

## map(USP Lab(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 Dec 10 21:04:17 JST 2011
    	: OpenUSP (LINUX+FREEBSD/PYTHON2.4/UTF-8)

### 【説明】

引数のファイルまたは標準入力のテキストデータが縦キーフィールド<n>個、横キーフィールド<m>個(未指定時 m=1)、残りがデータフィールドであると仮定し、データを表に並べて出力する。表に展開することでデータの欠落が発生する場合は0で補完する。補完する文字は-mオプションで変更できる。

### 【例1】

縦型データをmapするには次のようにコマンドを実行する。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 B C ...と順にインデックスが追加される。

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

### 【ワンポイント】

例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を実施することができる。<数値>はデータ部のフィールド数の約数である必要がある。

    $ 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する
    * * 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(USP Lab(1))、tateyoko(USP Lab(1))

- ∧

last modified: 2012-04-12 20:30:58