MCMDでは、CSVデータの先頭行を項目名として扱うことも可能であるし、 また項目名行がなくても項目番号で項目を指定することもできる。 項目名行の扱いに関係するパラメータは-nfn,-nfno,-nfni,-xの4つある。 以下では、例を示しながら、その利用方法について説明する。 なお、項目番号は左から0,1,2のように0から始まることに注意する。
-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
-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
-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
項目名行がある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
項目名として利用可能な文字は以下の通りである。
マルチバイト文字(UTF-8など)
アルファベット(a-z,A-Z)
数字(0-9)
記号
ただし、記号については、以下の9つの利用は避けることを推奨する。 利用してエラーとなるわけではないが、いずれもMCMDの中で項目指定時の特殊文字として利用しており その特殊用途を利用できなくなる可能性があるからである。
, カンマ
: コロン
% パーセント
* アスタリスク
? クエスチョンマーク
& アンド
\ バックスラッシュ
] 四角括弧右
[ 四角括弧左
項目番号の指定では、単純に項目番号をカンマで区切って列挙する以外にも、 後ろの項目からの番号指定("L"を付ける)や範囲(-)を指定することが可能である。 例えば0Lとすれば、最後の項目を指定したことになり、 2Lとすれば、最後から数えて2番目の項目(0番から始まることに注意)を指定したことになる。 また0-5と指定すれば、0番項目から5番項目まで6つの項目を指定したことになる。 すなわち0,1,2,3,4,5と指定したことと同等である。
「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
「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
「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
「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-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
多くのコマンドで項目の指定にはf=が利用される。 f=の書式は、「入力項目:出力項目」で、 出力項目の指定を省略すれば、入力項目名が出力項目名として利用される。 また、f=0:数量のように、番号指定と混在させることも可能である。
「数量:売上数量」の指定により、項目名が「数量」から「売上数量」に変換されて出力される。
$ 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
以下の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)
番号指定と出力項目名指定を混在させることも可能である。
$ 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
複数項目を指定する際にはには、項目名に"*"と"?"のワイルドカードを利用することができる。 "*"は任意の長さの任意の文字列にマッチし、"?"は任意の1文字にマッチする。 また、ワイルドカードの評価順は入力データ上の項目の並び順となることに注意する。 例えば、入力データの項目の並びが、A5,A3,A4,A2,A1であれば、f=A*は f=A5,A3,A4,A2,A1と評価される。
「数量*」にて、「数量」で始まる項目名(「数量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
「数量」で始まる項目名のうち、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
出力項目名で指定された"&"は特殊な意味を持ち、入力項目名に置換される。 例えば、f=abc:xx&xxでは、出力項目名はxxabcxxに置換される。 "&"は、出力項目名の任意の位置に指定することができ、またその指定数に制限はない。 ただし、"&"記号は、シェルにおいて「バックグラウンド実行」と解釈されてしまうので、 ダブルクォーツで囲うなどしてエスケープする必要がある。
ここでは、"&"が入力項目名である「ブランド」に置換され、「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
出力項目名指定における売上&の&が入力項目名(例えば「数量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
集計処理コマンドでは、キー項目ごとに指定された項目が集計処理され、キー項目ごとに1行出力される際、指定した項目以外の項目はどのレコードが出力さるかについては不定である。 例えば、msumコマンドで、顧客、日付、商品、金額という項目のデータを想定し、msumコマンドで顧客別に金額を集計するのに、msum k=顧客とf=金額と指定した場合、それ以外の日付、商品項目についてはどのレコードが出力されるか不定であることに注意してください。