• ベストアンサー

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 出力のソートの必要はありません。 これをシェル・スクリプトだけで実装するのは、無理でしょうか。良いアイディアをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.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 の機能「連想配列」を 実現しているアルゴリズム「ハッシュ法」の影響のためです。

sarutobi
質問者

お礼

丁寧なご回答ありがとうございます。 半ばあきらめていたところでしたので、天の助けです! マニュアル等も一応読んだのですが、「だから?」という感じで、実装まで頭が追いつきませんでした。 とても勉強になりました。 かさねて御礼申し上げます。

その他の回答 (1)

  • 100Gold
  • ベストアンサー率27% (284/1018)
回答No.1

質問の主旨に合致するかどうかはわかりませんが、awkコマンドを利用すれば簡単にできると思いますよ。awkはコマンドじゃなくて言語に近いからアウトといわれればそれまでですが……。

sarutobi
質問者

補足

awk自体が初心者なので、簡単なものしか書けません。 awkを使うのかな、とは当たりをつけられるのですが、具体的にどうするのかが・・・ 本当は考えていろいろやってみるのがいいのですが、あまり時間がないのです。

関連するQ&A

  • VBA でCSV集計

    VBAをはじめて1ヶ月のものです。 VBAの集計ツールを作成していますが 思うようにいかず、お知恵をお借りしたいと考えています。     abcというフォルダ配下に以下のように4桁の日付を示す フォルダが日付毎にあります。(いくつあるかはわかりません。) さらにその配下にいくつかのcsvファイルがおいてありますが aaa.csvというcsvのみ抽出し 最終的には合体.csvのような集計CSVを作成したいと考えています。 以上よろしくお願いいたします。 (1) abc → 0812フォルダ <aaa.csv>     A列     B列    C列 1行 100     200    8月12日                       2行 100     100 3行 200     200 4行 300     100 5行 100     100 6行 200     200 7行 400     100 8行 100     100 (2)abc → 0813フォルダ <aaa.csv>      A列     B列     C列 1行   0      300    8月13日              2行 100      100 3行 100      200 4行 100      200 5行 100      200 6行 300      200 7行 300      400 8行 200      100 ↓ (3)<合体.csv>     A列     B列      C列     D列     E列     F列     G列    (日付)  (A1~A4計)(A5~A8計)(合体B+C)(B1~B4計)(B5~B8計)(合体E+F) 1行 8月12日   700      800     1500     600     500     1100 2行 8月13日   300      900     1200     800     900     1700

  • 【Excel】この条件で集計を3つに分けたい…??(謎

     今、お小遣い帳のようなのを作っているのですが… 以下の条件で集計したい場合、D~F列に入れる式は、 どのようにすれば… というか、式で可能ですか?(謎 分からなくて困ってます。よろしくお願いいたします☆ ・1行目は項目名です。 ・2行目には前の月の繰越金を入力します。 ・A列で、文末に●があるものの集計はE列に出す。 ・A列で、文末に■があるものの集計はF列に出す。 ・A列で、●も■も無い項目の集計はD列に出す。 図にすると↓こんな感じです。※変になるかも;(>_<) ┌─┬──┬──┬──┬──┬──┬──┬ │  │ A │ B │ C │ D │ E │ F │ ├─╋━━┿━━┿━━┿━━┿━━┿━━┿ │1 ┃摘要│収入│支出│合計│●計│■計│ ├─╂──┼──┼──┼──┼──┼──┼ │2 ┃繰越│   │   │1000│1000│1000│ ├─╂──┼──┼──┼──┼──┼──┼ │3 ┃…●│1000│   │   │2000│   │ ├─╂──┼──┼──┼──┼──┼──┼ │4 ┃……│ 500│   │1500│   │   │ ├─╂──┼──┼──┼──┼──┼──┼ │5 ┃…■│   │ 500│   │   │ 500│ ├─╂──┼──┼──┼──┼──┼──┼ ちなみに、●と■には、それぞれ違う銀行名を入れる予定です。 ( つまり、お小遣いと同じシートで預金も管理したいかなーって。) お願いします☆  

  • エクセルでの条件式等による数値集計

    エクセルの条件式&集計についての質問です。 A列に売上年月日 C~F列には1行目は仕入年月日、2行目以降は仕入額が入っています。C~F列は同じ年月日は発生しません。 A列が07/2/28で商品1の場合、A列と同じ年月日のD列までの仕入額合計”30”をG列に表示させたいのです。 G列にどのような計算式を入力すればよいのでしょうか? マクロなどを使用せずに処理したいのですが…宜しくお願い致します。 A:売上日 B:品名 C:07/1/31 D:07/2/28 E:07/3/31 F:07/4/30 G:計 07/2/28 商品1    10     20      15       5    30  07/2/28 商品2    60     90      20       70   150 07/3/31 商品3    20     50      10       90    80 07/4/30 商品4    0     200      10       80   290

  • awkで列を集計するシェルについて

    シェル初心者です。教えてください。 ログファイルが10万行超えるものでシェルにて集計することになり、下記のような集計ができればと思っています。 商店名 商品名  価格 A商店 りんご   100 B商店  ぶどう 300 A商店  みかん 150 C商店  りんご 100 A商店  りんご 100 B商店  みかん 150 C商店  りんご 100 C商店  ぶどう 300 ※各列はブランク(空白)によって区切られ、改行済みで行数は10万行以上 (1)awk '{print $1}' | uniq -d (重複した商店の抽出) (2)awk '{print $2}' | uniq -d (重複した商品名の抽出) (1)、(2)の抽出を満たす「価格」の合計を"集計結果”として > shukei.txt などに出力したいと思ってます。 VBAでいれば、firlterしsumifして合計するようなイメージのものです。 ご教授お願い致します><

  • 集計について

    A列に番号、B列に作成日、C列に作成者、D列に作成数とあります C列でソートした後にF列に作成者毎の合計が入力されています。その合計をB列の作成日の個人毎の個数で割ってG列に出力したいのですが、マクロではどうやるのでしょう。(斎藤の日付個数は8/7が二つあるので3になる) 教えてください A B C D E F   G 1 10 8/7 斎藤 300 2 11 8/7 斎藤 200 3 12 8/9 斎藤 500 4 13 8/10斎藤 100 1100  333.3 5 14 8/7 山田 100 6 15 8/9 山田 200 7 16 8/10山田 500 800 266.6 8 17 8/6 渡部 500 9 18 8/7 渡部 400 900 450.0 この様な表なのですが

  • このような行の集計(統一)方法はありますか?。

      次のような行の集計(統一)をしたいのですが、できる方法があればご教示ください。   統一は方法は、関数でも、マクロでもかまいません。   予めA列でソートを行っており、行は5行目からとなります。      ソートの結果、下記のような   5行目6行目7行目のあA列が同じであるため、5行目と6行目7行目の数字は合計、   文字はそのまま表示とした統一方式です。   なお、BCD列の文字列には必ず1列にしか文字は入りせん。   また、結果を別シートに統一でもかまいません。     列    A  B  C  D  E  F  G             5行目  あ い          1  3  4 6行目  あ    か     3  5  6 7行目  あ       き  1  2  1  ↓ 結果   あ い か き  5  10  11     行は;5行目から500行ほどあり、A列の同一項目行が2行であったり、4行であったり、   また、単一の行もあるなど、バラバラです。   要は、A列が同じ行は一行に統一したいのです。   どなたか、よろしくお願いします。   

  • Excelの集計機能

    エクセルの集計機能についてお聞きしたいと思います。 A~Fまで300行ほど空白セルなしで作成したシートがあります。 (1行目は項目名としています) そこから操作手順として、 (1)F列を昇順で並び替え (2)集計機能にて、グループの基準:B列、集計の方法:合計、集計するフィールド:E列、他のオプションは無効として実行 (3)同じく集計にて、グループの基準のみC列に変更して実行 (4)同じく集計にて、グループの基準のみD列に変更して実行 すると、(2)の時点で上部に総計がありその下に集計があり、集計の下に集計がありさらに下に集計がある、入れ子になってぶら下がる状態になるはずなんです。 ところが私の環境では最上部の集計のみ上側に入れ子になってしまいます。 わかりづらいかと思いますが、 A列|B列|C列|D列|E列|F列|   |総計|  |  |  |  |   |(2) |  |  |  |  |   |  |(3) |  |  |  |   |  |  |(4) |  |  | とならなければならないのに、 A列|B列|C列|D列|E列|F列|   |  |  |(4) |  |  |   |  |(3) |  |  |  |   |総計|  |  |  |  |   |(2) |  |  |  |  | となってしまうのです。 Microsoftのホームページにてレジストリ(Excel97Subtotals)を追加すると修正されるとあったので実施してみました。 ですが2番目の集計以降は正常なのですが、最上部だけやはり上側に入れ子されているような状態です。 Excelのバグなのでしょうか? 環境は、 WindowsXP SP2 Office2003 SP2 です。 おわかりになられる方がいらっしゃればご助力お願いいたします。

  • EXCELのDSUM関数で集計条件に日付を入れると数字が消える

        B列      C列     D列   E列      F列      G列 1行  日付      区分    金額   集計する条件 2   2000/1/1   A社   1000    区分     日付      日付 3   2000/1/10    B社    500   A社    >=2000/1/1  <2000/2/1 4   2000/1/15    A社    300    5   2000/2/5   A社     200    集計結果 6                        =DSUM(B1:D5,3,E2:G3) 上記のような表をEXCELで作成しました そのうちA社の1/1~1/31の金額をDSUM関数を利用して集計したく 上記のようにDSUM関数に引数を入力しました しかし集計条件が区分のみ(E2:E3)だとA社の2/5までの合計額1500が反映するのですが、日付を入れた途端に0になってしまうのです ちなみに、一例として日付→商品区分に直して日付の代わりに 「機械」「部品」といった文字を入力してみると ちゃんと条件通りの集計をしてくれます 日付の入力のしかたに間違いがあるのでしょうか? テキスト見ながらちゃんとやってると思いこんでるだけで 落とし穴にはまってるのだと思います 是非良きアドバイスをお願いします  

  • Dictionaryを使い4つの条件の一致で2つの集計列を集計したいのです

    条件4項目 日付&単位&単価&区分(A列、C列、D列、F列)の一致するもののB列及びE列を集計して別シートに書き出したいのです。  sheet1 A   B   C   D   E   F 日付  数   単位  単価  計   区分 3/12  2    人  10000 20000  通常 3/12  1    人  10000 10000  通常 3/12  1    時間  2000 10000  残業 3/14  4    時間  2000  8000  残業 3/15  4    人  10000 40000  通常 このような表を sheet2 A   B   C   D   E   F 日付 数 単位 単価 計 区分 3/12  3    人  10000 30000  通常 3/12  1    時間  2000 10000  残業 3/14  4    時間  2000  8000  残業 3/15  4    人  10000 40000  通常 のようにまとめたいのです。 Dictionaryを用い、A列、C列、D列、F列を一旦結合しkeyとし、同じものが登録されていたら、itemとしてB列及びE列の値を加算させて、登録件数分を書き出しという流れでやりたいのですが、出来ません。 助けて下さい。お願いします。

  • エクセルで集計

    エクセルでの合計について教えていただきたいのです。 A1~A10000まで日付が、B1~B10000まで数値が入力されています。 B列の数値を50行ごとに合計し、C列に表示する方法。 現在は、sum関数で手作業です。 簡単に表示できる方法を教えてください。 また、C列に合計のある行をD列(D1・D2・D3・・・)、E列(E1・E2・E3・・・)、F列(F1・F2・F3・・・)に並べたいのです。(50行ごとに間引いて表示するような感じです) 現在は、=C50・=C100・=C150のように手作業です。 もっと多量のデータが入力されたシートもあります。また、100行ごと150行ごとなど合計行が違う場合もあります。 エクセル初心者です。 よろしくお願いいたします。

専門家に質問してみよう