- ベストアンサー
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 出力のソートの必要はありません。 これをシェル・スクリプトだけで実装するのは、無理でしょうか。良いアイディアをお願いします。
- sarutobi
- お礼率56% (111/197)
- その他(プログラミング・開発)
- 回答数2
- ありがとう数1
- みんなの回答 (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を使うのかな、とは当たりをつけられるのですが、具体的にどうするのかが・・・ 本当は考えていろいろやってみるのがいいのですが、あまり時間がないのです。
関連する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列の値を加算させて、登録件数分を書き出しという流れでやりたいのですが、出来ません。 助けて下さい。お願いします。
- ベストアンサー
- Visual Basic
- エクセルで集計
エクセルでの合計について教えていただきたいのです。 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行ごとなど合計行が違う場合もあります。 エクセル初心者です。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
お礼
丁寧なご回答ありがとうございます。 半ばあきらめていたところでしたので、天の助けです! マニュアル等も一応読んだのですが、「だから?」という感じで、実装まで頭が追いつきませんでした。 とても勉強になりました。 かさねて御礼申し上げます。