map

提供: Personal Tukubai for Academic
2021年6月7日 (月) 08:37時点におけるPt4a editor (トーク | 投稿記録)による版 (Batch Update)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

名前

map : 縦型ファイルを縦キー/横キー形式のマトリクス型ファイルに変換

書式

使い方とオプション

Usage

map       [-<l>] num=<n>x<m> <file>
map +yarr [-<l>] num=<n>x<m> <file>

Option

-m<str>
-n

説明

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

例(その1)

縦型データを map する。num=<n> の値は縦キーのフィールド数を表します。この場合、横キーは1フィールドになります。

$ cat data
001 a店 01/01 103
001 a店 01/02 157
002 b店 01/01 210
002 b店 01/02 237
↑       ↑     ↑
縦KEY   横KEY データ部
num=2

$ map num=2 data | keta
*   * 01/01 01/02  ← 横KEY
001 a店   103   157
002 b店   210   237
↑
縦KEY

例(その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
縦KEY=店舗 横KEY=日 データ=売数、客数の2列の場合
a店 1日目 103 62
a店 2日目 157 94
a店 3日目 62 30
a店 4日目 131 84
    ・
    ・
d店 6日目 98 69
d店 7日目 101 90
↑     ↑   <---->
縦KEY 横KEY データ部

$ map num=1 data | keta
* * 1日目 2日目 3日目 4日目 5日目 6日目 7日目  ← 横KEY
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
↑  ↑
縦 インデックスを付与 (A-Z)
KEY

例(その4)

例(その2) の結果をさらに“sed”コマンドで“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      付与(a-z)
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

例(その6)

map は -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)

-<l> オプションを使うと、<l> フィールド分ずつ map します。<l> はデータ部のフィールド数の約数でなければなりません。

$ cat data
X x 1 2 3 4 5 6
X y 1 2 3 4 5 6
Y x 1 2 3 4 5 6
Y y 1 2 3 4 5 6
    ----- -----
    3     3

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

-<l> オプションと 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 オプションを指定すると、付加するインデックスが数値になります。この場合はインデックスが 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

Version and Edition

Version : Tue Jun 18 19:00:37 JST 2019

Edition : 1


© 2021 Universal Shell Programming Laboratory site