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

このQ&Aのポイント
  • シェル初心者の方に向けて、awkを使用して列を集計する方法について解説します。
  • あるログファイルをシェルで処理する際に、商店名や商品名の重複を抽出し、それに対応する価格の合計を求める方法について説明します。
  • 具体的なコマンドや出力先についても触れながら、シェル初心者でも理解しやすいように説明します。
回答を見る
  • ベストアンサー

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して合計するようなイメージのものです。 ご教授お願い致します><

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

  • ベストアンサー
  • hs001120
  • ベストアンサー率60% (473/788)
回答No.1

>(1)、(2)の抽出を満たす「価格」の合計を 「抽出を満たす」の論理結合が不明確ですが、 単に、データ中に実在する商店名と商品について (商店名 + 商品)単位に価格を集計する だけであれば awk '{ s[$1,$2] += $3 } END { for( x in s) print x,s[x] }' |sort > shukei.txt で可能と思います。 「A商店」の「ぶどう」は"無い"ということを出力したければ awk '{ ++a[$1];++b[$2];s[$1,$2] += $3} END { for(x in a) for (y in b) print x,y,s[x,y] }' |sort > shukei.txt とか

vba_knowledge
質問者

お礼

回答誠に有難うございます>< 補足の構文も有難う御座います>< 1点、集計の結果で”商店Aりんご200”という出力となり、区切りスペースがなくなってしまうのですが、区切りスペースをそのまま残しての集計出力できる方法は御座いますか>< 実際ログでは商店A商品いずれも文字数で区切りスペースが挿入など今の自分では・・・今一度ご教授いただけると幸いです。よろしくお願いします><

関連するQ&A

  • 集計するシェルスクリプト

    りんご,3 みかん,2 りんご,5 りんご,1 なし,3 みたいなデータを りんご,9 みかん,2 なし,3 のように集計するシェルスクリプトを書こうと思っています。 sortとuniqでレコードの名前を外部ファイルに書き出してループ処理というのは思いついたのですが、いまいち綺麗じゃないような気がします。外部ファイルを使わずに処理する方法があれば、教えてください。

  • エクセル データ集計について

    エクセルのデータ集計についてご教示下さい。 (1)まず、以下のような項目があるとします。 (重複は無し) りんご みかん ぶどう (2)次に以下のようなデータがあるとします。 (重複あり。順番はランダム) ぶどう みかん ぶどう そして(1)と(2)から以下のような集計結果にするにはどのような関数を使うと良いでしょうか? (|はセルの区切りと思って下さい) りんご | 0 みかん | 1 ぶどう | 2 以上よろしくお願いします。

  • エクセルの集計

    エクセルの集計で質問します。 A列に「りんご」か「みかん」が入っている行を集計したいと思っています。    A 1 りんご、なし 2 みかん、もも 3 りんご、みかん 4 ぶどう 5 りんご 6 ぶどう、もも 7 みかん という表があると、期待している集計値は「5」なのですが、どのような関数を使えばよいかわかりません。 よろしくお願いします。

  • 種類別・期間別の集計

    下のような表での種類別・期間別の集計をしたいのですが?    A   B    C 1  8/1 10.000 りんご 2  8/2 50.000 みかん 3  8/4 12.000 りんご 4     10.000 ぶどう    ・ 10  8/15 5.000 みかん 11  8/16 25.000 ぶどう    ・ 26  8/30 13.000 りんご 35  8/31 8.000 みかん 毎月1日から15日と16日から月末までの各”りんご””みかん”2ぶどう”の個別の集計をしたいのですが日付が入る関数が分かりません。 月は毎月替わりますが、1日から15日と16日から月末は変わりません。 日付のセルには空白のセルが入る事があります。 よろしくお願いします。

  • エクセル データの集計表を作成する

    シート1のデータを集計してシート2に結果を出したいのですが、関数を使いどのように行えば良いかお教えいただけますでしょうか。 りんご  A みかん  A りんご   りんご  B ぶどう   このようなデータがあり 1.その中にある項目を自動で一つ出し、 2.それぞれ済の分を集計して・・・ Aの集計 商品   個数 りんご   1 みかん   1 ぶどう   0 というようにしたいのですが、どなたかお答えいただけますでしょうか?よろしくお願い致します。

  • あるセルの文字列が条件で、あるセルに色を設定するには?(2)

    例えば、下のような表で      A      B      C       D      1   商品名   数量     名前    2   りんご     2     さとう 3   みかん     1     さとう     3 4   ぶどう     1     すずき 5   ばなな     2     すずき     3 6   みかん     3     たなか 7   りんご     2     たなか 8   ぶどう     2     たなか     4 「みかん」という商品名の時だけ、C列の重複している名前の一番下のセルに、黄色を設定したい場合は、どうしたらよいのでしょうか? つまり、セルC3とC8に色をかけたいのです。不可能でしょうか(-_-;)ちなみにD列は、重複している名前の一番下の行に合計が出る関数が入っています。一番下が難しいなら、みかんの商品があるうちの重複している名前(さとう・たなか)すべてに色がついてもかまいません。 どなたかいい方法があれば教えてください。よろしくお願いします(>_<)

  • awkで可変文字列をマッチング

    シェルなどでawkを使う際に、シェルの引数として渡された文字列をawkに渡し、それを条件にマッチングをかけたいのですが、どうしたら良いのでしょうか?(まあ、素直にgrepを使えばいいのですが・・・) 例えば、 cat foo.txt | awk '{if ($2 == ptn) print}' ptn=$<シェルの引数> とかやれば、2番目のフィールドに完全に一致する行が抽出できるのですが、 cat foo.txt | awk '/ptn/ {print}' ptn=$<シェルの引数> とかやっても、"ptn"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。

  • 単純作業で入力した番号の集計

    様々な数字を入力して、入力した何番が何個なのか集計する方法や、 その作業に役立つフリーソフトを探しています。 希望の作業を判り易く「果物」で説明しますと、 りんご みかん ぶどう みかん ぶどう ぶどう みかん りんご いちご と、同じ果物が重複しても一個ずつ単品で入力します。 文字を入力したらEnter 入力→Enter→入力→Enter→入力→Enter→入力→Enter→ の繰り返しです。 すると、結果が自動的に りんご2 みかん3 ぶどう3 いちご1 と、表示してほしいのです。 今、考えてる作業は、エクセルのAの縦欄だけを使い、様々な文字を数百行書き出します。 何度も同じ番号が重複しますが、入力→Enterの繰り返しです。 すべて入力後、にエクセルで並べ替えしても、何番が何個重複したのか一目では解り辛いので、 りんご2 みかん3 ぶどう3 いちご1 と入力結果を一目で確認したいのです。 単純作業を求めているので、 入力+Enterの繰り返しだけでの作業ですが、 もっと便利な方法があれば、アドバイスも宜しくお願いいたします。

  • シェル:サマリーの仕方で困っています

    あるテキストファイル(約300000行)のサマリーの仕方で困っています。 ~内容~ 下記のようなファイルがあるとします。 2009/11/20,06:06:01,りんご,1 2009/11/21,07:10:01,みかん,3 2009/11/21,08:55:03,ぶどう,4 2009/11/23,10:06:32,りんご,7 2009/11/24,15:10:01,みかん,5 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ りんご,8 みかん,8 ぶどう,4 このデータをサマリーしたいのですが、どのようなロジックが必要でしょうか?初心者の為awkを使用して挑戦しましたが私のレベルでは無理でした。 アドバイスいただけたらと思います。

  • BookAのデータを元にBookBに文字列を抽出する。

    BookAのデータを元にBookBに文字列を抽出する。 BookAに下記のデータがあります ブック名="データA" シート名="名称"としてあります。 A B C D 1 A社   B社 2 りんご 青森 りんご 青森 3 みかん 愛媛  ぶどう 栃木 4 ぶどう 山梨  すいか 茨城 上記データを元に下記BookBに抽出する ブック名="マスターA" シート名="メイン"としてあります。   A   B   C 1 A社 みかん 愛媛 上記A1,B2に入力規制のドロップダウンリストから、A1="A社"、B1="みかん" を選択した時に (ここまではINDIRECTを使って出来ました。) C1に"愛媛"を抽出するにはどうしたらよいのでしょうか? A1にB社を選んだ時には、B1では "りんご"、"ぶどう"、"すいか" が選択できるので C1にはそれぞれ "青森"、"栃木"、"茨城" を抽出したいのですが。 よろしくお願いします。

専門家に質問してみよう