- ベストアンサー
Kシェル上でフラットファイルの条件付き集計をしたい。
いつもお世話になっています。Kornシェルで、以下のようなcsv形式のファイルを次の様に集計したいです。 <列A,C,D,E,F,G が全て一致する行毎に列Fの値を集計> (入力) 列A------列B------列C----列D---列E--列F-----列G------列F "10001","0090300", 11110," "," "," "," ",1013134 "10001","0090300", 11130,"0009","888","01","5050455",28428260 "10001","0090300", 11130,"0001","001","01","1111111",258925 "10001","0090300", 11165,"9900","999","09","9999903",0 "10001","0090300", 11110," "," "," "," ",592092 "10001","0090400", 11130,"0009","129","01","1018224",12489867 "10001","0090300", 11130,"0001","001","01","1111111",200000 "10001","0090400", 11165,"9900","999","09","9999904",834592 "10001","0090700", 11110," "," "," "," ",300000 (期待する出力) "10001","0090300", 11110," "," "," "," ",1905226 <--- 1行目, 5行目, 9行目が集計されている "10001","0090300", 11130,"0009","888","01","5050455",28428260 "10001","0090300", 11130,"0001","001","01","1111111",458925 <--- 3行目と7行目が集計されている "10001","0090300", 11165,"9900","999","09","9999903",0 "10001","0090400", 11165,"9900","999","09","9999904",834592 "10001","0090400", 11130,"0009","129","01","1018224",12489867 出力のソートの必要はありません。 これをシェル・スクリプトだけで実装するのは、無理でしょうか。良いアイディアをお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 お急ぎだというのに1日以上経ってしまいましたが、手遅れでしょうか? とりあえず、以下の awk スクリプトを試してみてください。 BEGIN { FS = OFS = "," } { # フィールド番号 $1 = 列A, $2 = B,..., $6 = F, $7 = G に対応 key = $1 $3 $4 $5 $6 $7 AtoG = $1 FS $2 FS $3 FS $4 FS $5 FS $6 FS $7 if (line[key] == "") { line[key] = AtoG } sum[key] += (0 + $8) } END { for (key in line) { print line[key], sum[key] } } このスクリプトを仮に calcsv.awk, CVS ファイルを csvdata とすると 以下のように実行します。 $ awk -f calcvs.awk csvdata なお、 >出力のソートの必要はありません。 このスクリプトではソートするつもりはないのですが、 行の出力される順序は以下のように不定となります。 "10001","0090300", 11130,"0001","001","01","1111111",458925 "10001","0090300", 11130,"0009","888","01","5050455",28428260 "10001","0090300", 11165,"9900","999","09","9999903",0 "10001","0090400", 11165,"9900","999","09","9999904",834592 "10001","0090400", 11130,"0009","129","01","1018224",12489867 "10001","0090300", 11110," "," "," "," ",1905226 これはスクリプトで用いている awk の機能「連想配列」を 実現しているアルゴリズム「ハッシュ法」の影響のためです。
その他の回答 (1)
- 100Gold
- ベストアンサー率27% (284/1018)
質問の主旨に合致するかどうかはわかりませんが、awkコマンドを利用すれば簡単にできると思いますよ。awkはコマンドじゃなくて言語に近いからアウトといわれればそれまでですが……。
補足
awk自体が初心者なので、簡単なものしか書けません。 awkを使うのかな、とは当たりをつけられるのですが、具体的にどうするのかが・・・ 本当は考えていろいろやってみるのがいいのですが、あまり時間がないのです。
お礼
丁寧なご回答ありがとうございます。 半ばあきらめていたところでしたので、天の助けです! マニュアル等も一応読んだのですが、「だから?」という感じで、実装まで頭が追いつきませんでした。 とても勉強になりました。 かさねて御礼申し上げます。