Previous: データ型 Up: Mコマンド Next: データ本体がない場合の動作 MCMD2
MCMD2 : Mコマンド : 項目の指定

2.6 項目の指定

MCMDでは、CSVデータの先頭行を項目名として扱うことも可能であるし、 また項目名行がなくても項目番号で項目を指定することもできる。 項目名行の扱いに関係するパラメータは-nfn,-nfno,-nfni,-xの4つある。 以下では、例を示しながら、その利用方法について説明する。 なお、項目番号は左から0,1,2のように0から始まることに注意する。

例1: -nfn指定

-nfn(no field name)を指定すると,先頭行を項目名行と見なさない。 そして項目は必ず番号で指定する(番号は0から始まることに注意する)。

$ more dat2.csv
a,2
b,5
b,4
$ msum -nfn k=0 f=1 i=dat2.csv o=rsl1.csv
#END# kgsum -nfn f=1 i=dat2.csv k=0 o=rsl1.csv
$ more rsl1.csv
a,2
b,9

例2: -nfno指定

-nfno(no field name for output)を指定すると,入力データの先頭行は項目名行として扱うが,出力データには項目名を出力しない.

$ more dat1.csv
key,val
a,2
b,5
b,4
$ msum k=key f=val -nfno i=dat1.csv o=rsl2.csv
#END# kgsum -nfno f=val i=dat1.csv k=key o=rsl2.csv
$ more rsl2.csv
a,2
b,9

例3: -nfni指定

-nfni(no field name for input)の指定はmcutでのみ可能であるオプションである. このオプションは-nfnoと逆の働きをする. すなわち,入力データの先頭行は項目名行として扱わないが, 出力データには項目名を出力する.

$ mcut f=0:key,1:val -nfni i=dat2.csv o=rsl3.csv
#END# kgcut -nfni f=0:key,1:val i=dat2.csv o=rsl3.csv
$ more rsl3.csv
key,val
a,2
b,5
b,4

例4: -x指定

項目名行があるCSVデータに対して、項目番号で指定したい場合は-xオプションを利用する。

$ msum -x k=0 f=1 i=dat1.csv o=rsl4.csv
#END# kgsum -x f=1 i=dat1.csv k=0 o=rsl4.csv
$ more rsl4.csv
key%0,val
a,2
b,9

2.6.1 有効な項目名

項目名として利用可能な文字は以下の通りである。

  • マルチバイト文字(UTF-8など)

  • アルファベット(a-z,A-Z)

  • 数字(0-9)

  • 記号

ただし、記号については、以下の9つの利用は避けることを推奨する。 利用してエラーとなるわけではないが、いずれもMCMDの中で項目指定時の特殊文字として利用しており その特殊用途を利用できなくなる可能性があるからである。

  • , カンマ

  • : コロン

  • % パーセント

  • * アスタリスク

  • ? クエスチョンマーク

  • & アンド

  • \ バックスラッシュ

  • ] 四角括弧右

  • [ 四角括弧左

2.6.2 有効な項目番号

項目番号の指定では、単純に項目番号をカンマで区切って列挙する以外にも、 後ろの項目からの番号指定("L"を付ける)や範囲(-)を指定することが可能である。 例えば0Lとすれば、最後の項目を指定したことになり、 2Lとすれば、最後から数えて2番目の項目(0番から始まることに注意)を指定したことになる。 また0-5と指定すれば、0番項目から5番項目まで6つの項目を指定したことになる。 すなわち0,1,2,3,4,5と指定したことと同等である。

例1: 範囲指定

「0-4」の指定により、「0,1,2,3,4」を指定したことになる。

$ more dat1.csv
ブランド,数量01,数量02,数量03,数量04,数量05,数量06,数量07,数量08,数量09,数量10
A,10,50,90,130,170,210,250,290,330,370
B,20,60,100,140,180,220,260,300,340,380
C,30,70,110,150,190,230,270,310,350,390
D,40,80,120,160,200,240,280,320,360,400
$ mcut -x f=0-4 i=dat1.csv o=rsl1.csv
#END# kgcut -x f=0-4 i=dat1.csv o=rsl1.csv
$ more rsl1.csv
ブランド,数量01,数量02,数量03,数量04
A,10,50,90,130
B,20,60,100,140
C,30,70,110,150
D,40,80,120,160

例2: 範囲指定逆順

「4-0」の指定により、「4,3,2,1,0」を指定したことになる。

$ mcut -x f=4-0 i=dat1.csv o=rsl2.csv
#END# kgcut -x f=4-0 i=dat1.csv o=rsl2.csv
$ more rsl2.csv
数量04,数量03,数量02,数量01,ブランド
130,90,50,10,A
140,100,60,20,B
150,110,70,30,C
160,120,80,40,D

例3: 複数範囲指定

「1-0,2-4」の指定により、「1,0,2,3,4」を指定したことになる。

$ mcut -x f=1-0,2-4 i=dat1.csv o=rsl3.csv
#END# kgcut -x f=1-0,2-4 i=dat1.csv o=rsl3.csv
$ more rsl3.csv
数量01,ブランド,数量02,数量03,数量04
10,A,50,90,130
20,B,60,100,140
30,C,70,110,150
40,D,80,120,160

例4: 末尾項目からの指定

「2L」の指定により、項目の後ろから数えた2番項目(数量08)を指定したことになる。

$ mcut -x f=2L i=dat1.csv o=rsl4.csv
#END# kgcut -x f=2L i=dat1.csv o=rsl4.csv
$ more rsl4.csv
数量08
290
300
310
320

例5: 末尾項目からの指定と範囲指定

「5-3L」の指定により、5番項目~後ろから3番目の項目、すなわち「5,6,7」を指定したことになる。

$ mcut -x f=5-3L i=dat1.csv o=rsl5.csv
#END# kgcut -x f=5-3L i=dat1.csv o=rsl5.csv
$ more rsl5.csv
数量05,数量06,数量07
170,210,250
180,220,260
190,230,270
200,240,280

2.6.3 入力項目と出力項目

多くのコマンドで項目の指定にはf=が利用される。 f=の書式は、「入力項目:出力項目」で、 出力項目の指定を省略すれば、入力項目名が出力項目名として利用される。 また、f=0:数量のように、番号指定と混在させることも可能である。

例1: 基本例

「数量:売上数量」の指定により、項目名が「数量」から「売上数量」に変換されて出力される。

$ more dat1.csv
ブランド,数量
A,10
B,20
C,30
D,40
$ mcut f=ブランド,数量:売上数量 i=dat1.csv o=rsl1.csv
#END# kgcut f=ブランド,数量:売上数量 i=dat1.csv o=rsl1.csv
$ more rsl1.csv
ブランド,売上数量
A,10
B,20
C,30
D,40

例2: 追加項目名

以下のmaccumコマンドでは、「ブランド」項目で並べ替えた後、 「数量」項目の値を累積し、「累積数量」項目として追加出力する。 もし、「f=数量」とだけすれば、累積結果も「数量」という名の項目となり、 オリジナルの「数量」項目とダブってしまいエラーとなる。

$ maccum s=ブランド f=数量:累積数量 i=dat1.csv o=rsl2.csv
#END# kgaccum f=数量:累積数量 i=dat1.csv o=rsl2.csv s=ブランド
$ more rsl2.csv
ブランド%0,数量,累積数量
A,10,10
B,20,30
C,30,60
D,40,100
$ maccum s=ブランド f=数量 i=dat1.csv o=rsl2.csv
#ERROR# same field name is specified: 数量 (kgaccum)

例3: 番号指定との混在

番号指定と出力項目名指定を混在させることも可能である。

$ mcut f=0,1:売上数量 -x i=dat1.csv o=rsl3.csv
#END# kgcut -x f=0,1:売上数量 i=dat1.csv o=rsl3.csv
$ more rsl3.csv
ブランド,売上数量
A,10
B,20
C,30
D,40

2.6.4 ワイルドカード

複数項目を指定する際にはには、項目名に"*"と"?"のワイルドカードを利用することができる。 "*"は任意の長さの任意の文字列にマッチし、"?"は任意の1文字にマッチする。 また、ワイルドカードの評価順は入力データ上の項目の並び順となることに注意する。 例えば、入力データの項目の並びが、A5,A3,A4,A2,A1であれば、f=A*は f=A5,A3,A4,A2,A1と評価される。

例1: 基本例

「数量*」にて、「数量」で始まる項目名(「数量10」、「数量11」、「数量12」、「数量123」)にマッチする。

$ more dat1.csv
ブランド,数量10,数量11,数量12,数量123
A,10,15,9,1
B,20,16,8,2
C,30,17,7,3
D,40,18,6,4
$ mcut f=数量* i=dat1.csv o=rsl1.csv
#END# kgcut f=数量* i=dat1.csv o=rsl1.csv
$ more rsl1.csv
数量10,数量11,数量12,数量123
10,15,9,1
20,16,8,2
30,17,7,3
40,18,6,4

例2: ?のワイルドカード

「数量」で始まる項目名のうち、1からはじまる任意の1文字にマッチする項目名が選択される。 「数量123」にはマッチしない。

$ mcut f=数量1? i=dat1.csv o=rsl2.csv
#END# kgcut f=数量1? i=dat1.csv o=rsl2.csv
$ more rsl2.csv
数量10,数量11,数量12
10,15,9
20,16,8
30,17,7
40,18,6

2.6.5 出力項目名の置換

出力項目名で指定された"&"は特殊な意味を持ち、入力項目名に置換される。 例えば、f=abc:xx&xxでは、出力項目名はxxabcxxに置換される。 "&"は、出力項目名の任意の位置に指定することができ、またその指定数に制限はない。 ただし、"&"記号は、シェルにおいて「バックグラウンド実行」と解釈されてしまうので、 ダブルクォーツで囲うなどしてエスケープする必要がある。

例1: 基本例

ここでは、"&"が入力項目名である「ブランド」に置換され、「f=ブランド:ブランドコード」と指定したことと同等となる。

$ more dat1.csv
ブランド,数量10,数量11,数量12,数量123
A,10,15,9,1
B,20,16,8,2
C,30,17,7,3
D,40,18,6,4
$ mcut f="ブランド:&コード" i=dat1.csv o=rsl1.csv
#END# kgcut f=ブランド:&コード i=dat1.csv o=rsl1.csv
$ more rsl1.csv
ブランドコード
A
B
C
D

例2: ワイルドカードとの併用

出力項目名指定における売上&の&が入力項目名(例えば「数量10」)に置き換わる。 結果として、「数量」で始まる項目全てに対して「売上」を先頭に加えて出力することになる。

$ mcut f="ブランド,数量*:売上&" i=dat1.csv o=rsl2.csv
#END# kgcut f=ブランド,数量*:売上& i=dat1.csv o=rsl2.csv
$ more rsl2.csv
ブランド,売上数量10,売上数量11,売上数量12,売上数量123
A,10,15,9,1
B,20,16,8,2
C,30,17,7,3
D,40,18,6,4

2.6.6 集計処理コマンドについての注意点

集計処理コマンドでは、キー項目ごとに指定された項目が集計処理され、キー項目ごとに1行出力される際、指定した項目以外の項目はどのレコードが出力さるかについては不定である。 例えば、msumコマンドで、顧客、日付、商品、金額という項目のデータを想定し、msumコマンドで顧客別に金額を集計するのに、msum k=顧客とf=金額と指定した場合、それ以外の日付、商品項目についてはどのレコードが出力されるか不定であることに注意してください。

Previous: データ型 Up: Mコマンド Next: データ本体がない場合の動作 MCMD2