こんばんは。gawkとbashを用いてlogの集計を行っています。
その際にお小遣い帳のような機能を実現することがなかなか出来ずに
困っています。perlだったら、ネットでもかなり情報が豊富だし、
書籍も多いと思うけど、awkってUNIXの基本的な知識ってことでUNIX管理系の
書籍にちょこっと載ってるってケースが多いですよね。それか
ものすごく分厚い本でなかなかなじめないようなのとか。。。助けて下さい。
例えば

1/1 gohan 1000
1/1 kaimono 5000
1/1 kaimono 2000
1/2 karaoke 3500
1/2 gohan 1200
1/2 gohan 1500

といったデータがあったとして、これを

1/1 gohan 1000
1/1 kaimono 7000
1/2 karaoke 3500
1/2 gohan 2700

のように集計したいのです。月日の部分を基点にして、1/1の部分についてだけ
for(i in count)の形式を用いて集計する。その後1/2の部分について集計する。
というのをずーっと続けていくには、どのようなスクリプトを書けば
いいんですか?教えて下さい。どうかお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

{


sum[$1,$2] += $3
}

END {
for ( item in sum ) {
split(item, t, SUBSEP );
printf("%s %s %d\n",t[1],t[2],sum[item]);
}
}

こんなのでなんとかなります。
後はパイプでソートするなり、読み込みで空白行を飛ばすなり、・・・
    • good
    • 0
この回答へのお礼

わぉ。ご回答ありがとうございます。これだけ情報を頂ければ
あとは自分で頑張ってみますね。コードもURLも参考にします。
嬉しいですぅ。

お礼日時:2001/12/27 13:08

集計のやり方については No.1 の回答がズバリなので、私は、情報の紹介を。



確かに、awk は perl に比べて情報が少ないですよね。
私は、awk のマニュアルを主体に憶えました。

参考URLには、gawk のマニュアルと、awk を使った数値計算の情報を載せている
ページの awk のガイドの URL を載せておきます。

後者のページは、以下の URL からリンクが貼られています。他の人が書いた
スクリプトが、意外と良い教科書になったりします。

http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/algory …

参考URL:http://www.linux.or.jp/JM/html/GNU_gawk/man1/gaw …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qgawkの書式について

gawkについて勉強しています。

最終目的とは違うのですが、動作検証のため、以下のようなスクリプトを書いています。

/usr/local/bin/awk -F, '{system("/usr/bin/echo $1 $2")}' < /dev/console

これを実行して、コマンドラインから、test,testと入力すると、
test testと表示させたいのですが、何にも表示されません。
どこがおかしいのでしょうか?

ご教授お願いします。

Aベストアンサー

何がやりたいのかイマイチよくわかりませんがこんな感じでしょうか。。

$ awk -F, '{print $1" "$2}'
test,test  ←入力
test test  ←出力
aaa,bbb,ddd ←入力
aaa bbb   ←出力
^C      ←ctrl+cで終了
$

Qawk と gawk の書き方の違い

PCでAWKコマンドを使いたくてgawkを使ってみたのですが、
やっぱりawkのような書き方では上手く実行できないみたいです。
gawkのバージョンは v3.1.6です。

コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt

単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。

仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

Aベストアンサー

>やっぱりawkのような書き方では上手く実行できないみたいです。
エラー箇所と内容を返してくると思いますが具体的にどういう状況でしょうか。

単純に引用符の問題だけのように思えますが↓でどうでしょう。
※一部単純な誤記と思われる部分(\→\\、n→\n)も変更しました。

gawk -F, "{printf(\"copy aaa\\%s bbb\\%s\n\",$0,$0)}" list.txt

Qgawk複数ファイルを同ファイル名でフォーマットする方法

gawk複数ファイルを同ファイル名でフォーマットする方法


gawkを使いcsv形式のファイルをjson形式のファイルにフォーマットしようと考えています。


簡単に説明しますと、

●csvファイル

test1.csv
test2.csv
test3.csv

↓↓↓↓

●jsonファイル

xxx-test1.json
xxx-test2.json
xxx-test3.json

という風にフォーマットさせたいのです。


現在、

jsonファイル出力後の記述を

●aaa.awk

BEGIN{
FS = ",";
printf("{");
}
{
printf("%s,%s,%s,%s", $1,$3,$4,$5);
printf("],");
}
END{
printf("}");
}

このようにし

●コマンドライン

gawk -f aaa.awk test1.csv > xxx-test1.json

これで一ファイルずつのフォーマットはできたのですが、
ファイル数が複数あり面倒なため、一気にフォーマットしたいのです。


その方法をご教授お願い致します。

gawk複数ファイルを同ファイル名でフォーマットする方法


gawkを使いcsv形式のファイルをjson形式のファイルにフォーマットしようと考えています。


簡単に説明しますと、

●csvファイル

test1.csv
test2.csv
test3.csv

↓↓↓↓

●jsonファイル

xxx-test1.json
xxx-test2.json
xxx-test3.json

という風にフォーマットさせたいのです。


現在、

jsonファイル出力後の記述を

●aaa.awk

BEGIN{
FS = ",";
printf("{");
}
{
printf("%s,%s,%s,%s", $1,$3,$4,$5);
printf("],");
}
END{
printf("}");
}

このよう...続きを読む

Aベストアンサー

sh 的な構文なら

for i in *.cvs; do gawk -f aaa.awk $i > xxx-${i%.csv}.json; done

場合によっては xargs や find なんかも併用というかんじ。

QUNIX & TCP/IP に関するプログラムの入門書

 現在、サーバサイドで通信を利用したプログラム作成をする可能性がありまして、急遽勉強をしたいと思っております。
 そこで、タイトルのような入門書を探しているのですが、お薦めの書籍はありますでしょうか?

 ちなみに当方はビンボーなので、万単位のお金は出せません(せいぜい5千円くらい)。また、できればサンプルソースが多い本が好みです。
 また、クライアント側のプログラムは多少作ったことはありますので、通信の仕組みなどの説明は少なくてもいいです。

 どうか教えて下さい、お願いします。

Aベストアンサー

ちょっと値段が高いですが(8000円)
UNIXネットワークプログラミング(Vol1)
ピアソン・エデュケーション発行
はどうでしょうか。C言語での解説になっています。
これがUNIXの世界ではTCP/IPのバイブルとして使われています。大きい本屋にはあると思いますので、
まず手にとって見てはいかがでしょうか。

Qシェル(Unix/Linux)を使用してDBアクセス

上題どおりなのですが

シェルスクリプトを使用してORACLEなどDBへのアクセス・データ操作は
可能なのでしょうか?。

仮にできないとなると、業務系開発ではORACLEとシェルはどのように
組みあわせて使うのでしょうか?。。想像としては

・Oracleのコマンドでデータをテキストに出力しシェルで読みこみ

などが考えられますが・・。他にもDB関連で「こんな時にも使う」など
ノウハウがあれば是非教えて頂ければと思います。

よろしくお願いします。

Aベストアンサー

>シェルスクリプトを使用してORACLEなど
>DBへのアクセス・データ操作は
>可能なのでしょうか?。

は可能です。ぐだぐだ説明するより例を示した方が
分かり易いと思うので...

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF
select table_name from user_tables;
EOF #必ず行頭に!!

要するにEOFとEOFの間にSQL*Plus上で実行したい
コマンドを入力するだけです。
ここで気をつけないといけないのは2つ目の終わり
を示すEOFは必ず行頭に記述しなくてはいけない
という点です。
if文やwhile文の中で使うときについついインデント
をつけてしまいますが閉じる意味のEOFは必ず
行頭です。

ただ、業務系開発となるとあまりシェルスクリプト
でプログラムを開発することは少ないかと思います。
理由は2つあって

1.性能が悪い
2.セキュリティ的に好ましくない

1はシェルスクリプトでDBにアクセスする場合、
SQL*Plusで接続することが多くなりますが、SQL*Plus
は管理用モジュールの意味合いが強く、あまり
アクセスの最適化は計られていません。
よって同じ命令を投げてもPro*CやOCIと比較して
性能は良くないです。
また、シェルは実行毎にコンパイルが行われるので
それもあまりよろしくありません。

2はサーバ側にviなどで簡単に開けるtext形式ファイル
として配置するためサーバにさえログインすれば
どういった処理が行われているのかが簡単に把握でき、
やろうと思えば書き換えだってできてしまいます。
Pro*Cプリコンパイル、Cコンパイルなどを行えば
ロードモジュール化されるので実行はできても
内容の閲覧や修正は不可能です。
またご存知かもしれませんがOracleには
ストアドプロシージャという昨日もあり、
事前にコンパイル済みの状態でOracleのメモリ領域に
プログラムを常駐させておくことも可能です。

シェルスクリプトによるSQL*Plus経由のOracleアクセス
は主に非定期、非定型で行われるDB管理などに
用いると思ったほうがよいかと思います。

>Oracleのコマンドでデータをテキストに出力しシェルで読みこみ
はちょっと意味がよく分からないのですが、
Oracleの出力結果をログファイルに
吐き出したいのであればSQL*Plusであれば一番最初に
spool log.txt
と入力しておけばそれ以降の出力はlog.txtに出力
されます。
先述したEOFを使う場合は

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF > log.txt
select table_name from user_tables;
EOF #必ず行頭に!!

としても同様にlog.txtにその結果が出力されます。

>シェルスクリプトを使用してORACLEなど
>DBへのアクセス・データ操作は
>可能なのでしょうか?。

は可能です。ぐだぐだ説明するより例を示した方が
分かり易いと思うので...

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF
select table_name from user_tables;
EOF #必ず行頭に!!

要するにEOFとEOFの間にSQL*Plus上で実行したい
コマンドを入力するだけです。
ここで気をつけないといけないのは2つ目の終わり
を示すEOFは必ず行頭に記述しなくてはいけな...続きを読む


人気Q&Aランキング

おすすめ情報