• ベストアンサー

awkで複数ファイルをそれぞれ集計し、一つのファイルに出力するには

awkプログラミングを始めたばかりの初心者です。複数ファイルのデータをそれぞれ集計し、一つのファイルに出力するにはどのようなスクリプトを作ればよいのでしょうか。 例 [file1]10,20,30 [file2]20,30,40 [file3]30,40,50 それぞれのファイルの中にある数字を合計して、別のファイル(file4)に一覧表示させる。    ↓ [file4]60 90 120

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

>notnotさんに提示していただいたスクリプトは、どのようにして実行させればよいのでしょうか。 シェルプロンプトでそのまま打ち込むか、あるいは、そのままシェルバッチスクリプト中に書けば良いです。 >awkを実行させるのに、「jgawk -f "プログラム名" "データ名" > "結果表ファイル名"」と、バッジファイルを作って実行させるやり方しか知りません。 ' と ' に囲まれた中をpgm.awkに書いて、 awk -F, -f pgm.awk file1 file2 file3 > file4 としても良いです。 >各ファイルが複数行ある場合、どのようにすればよいのでしょうか。 ・各ファイルの行数は同じ ・各ファイルの同一行数目の数字個数は同じ とすると、awkプログラムを別ファイルに書く方式で示すと下記のようになります。 BEGIN{FS=","} #入力行のセパレータをカンマにする {L=FNR;N[FNR]=NF #ファイル行数をLに、j行目の数字個数をN[j]に入れる for(i=1;i<=NF;++i) SUM[FNR,i]+=$i} #j行目のi番目の各数字をSUM[j,i]に足しこんでいく END{ for(j=1;j<=L;++j) { for(i=1;i<N[j];++i) printf"%d ",SUM[j,i] printf"%d\n",SUM[j,N[j]] } }

ken8911
質問者

お礼

提示していただいたプログラムを意味が分かるまで何度も読み返しました。「なるほど」と思う事がいくつもあり、まだまだ初心者ですが、プログラムを作る楽しさが分かってきました。丁寧に教えていただき、ありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

各ファイル1行ずつしかないのなら、 awk -F, '{N=NF;for(i=1;i<=NF;++i) A[i]+=$i} END{for(i=1;i<N;++i) printf"%d ",A[i];printf"%d\n",A[N]}' file1 file2 file3 > file4

ken8911
質問者

補足

 回答していただいたのですが、私は、初心者のため、awkを実行させるのに、「jgawk -f "プログラム名" "データ名" > "結果表ファイル名"」と、バッジファイルを作って実行させるやり方しか知りません。notnotさんに提示していただいたスクリプトは、どのようにして実行させればよいのでしょうか。  また、各ファイルが複数行ある場合、どのようにすればよいのでしょうか。

  • utf7
  • ベストアンサー率29% (11/37)
回答No.1

Bシェルで書きますと、 #!/bin/sh sum1=0 sum2=0 sum3=0 for in_file in file1 file2 file3 do num1=`cat $in_file | awk -F, '{print $1}'` num2=`cat $in_file | awk -F, '{print $2}'` num3=`cat $in_file | awk -F, '{print $3}'` sum1=`expr $sum1 + $num1` sum2=`expr $sum2 + $num2` sum3=`expr $sum3 + $num3` done echo "$sum1 $sum2 $sum3" > file4 で出来ます。一応動作確認もしました。 file1~3が複数行から成り立っている場合は、上記では構文エラーになりますので、1行ずつ読んで・・・というロジックに修正する必要がありますが、ken8911さんの挙げた例に即せば、これで十分だと思います。

ken8911
質問者

お礼

参考になりました。回答していただき、ありがとうございました。

関連するQ&A

  • awkで複数ファイルのある列を抽出し出力したい

    awkプログラミングの初心者です。 今、複数ファイル(1000ファイル)から、それぞれある列(すべて同じ列番号)のデータを抜き出して、1つのファイルに出力したいと考えています。 具体的には、1列目に共通項、2列目以降に1000ファイル分の抽出された列を、合計1001列となるような1つのファイルとして出力したいと考えております。 awkを使って出力するには、どのようなスクリプトを作ればよいか教えていただけませんでしょうか。 <イメージ> 元となるファイル(例えば下記のように3ファイル、実際には1000ファイル)があります。 file1.txt: 1  10 2  15 3  17 :  : 1000  25 file2.txt: 1  5 2  40 3  22 :  : 1000  17 file3.txt: 1  9 2  20 3  16 :  : 1000  32 出力後のファイルイメージ: 1  10  5  9 2  15  40  20 3  17  22  16 :  :  :  : 1000  25  17  32 ちなみに、自分で作成したawkスクリプト(下記)では、上記出力後のイメージとは異なり、 縦にデータが結合されてしまいました。 awk `{print $2}` ./file*.txt > Output.txt 出力後のファイル: 10 15 17 : 25 5 40 :

  • awkでの複数のファイルへの出力

    awkで、1つのファイルから複数のファイルを作りたいのですが、どのような命令を書く必要があるでしょうか。 具体的には、1行ごとに整形したものを別ファイルに保存されるようにしたいのです。BASICのように、ファイルのオープン、クローズの命令があるのでしょうか? awkはgawk32+おーくの友達v094bで使っています。テキストの遊園地(http://homepage2.nifty.com/mozu/koza/park_of_text.html)がとてもわかりやすく書いてあるので、ここでawkを勉強しているのですが、リファレンス的なものも欲しいので、わかりやすいリファレンスになっているサイトやファイル(申しわけありませんが、日本語になっているもので)があれば、そちらの紹介もお願いいたします。

  • awkのファイル出力について

    今までシェルスクリプトではレスポンスが悪い為awkを使い始めました やりたい物は一応作れたのですが、ファイル出力が美しく無いので ご教授ください。 shで A="/export/home/report" echo hogehoge > $[A]/test.txt という感じで、awkの中でファイル出力させるときに パスやファイル名を変数に入れてそこに出力する方法はないでしょうか? こんな感じでやるとエラーになります。 nawk '{ BEGIN{ A="/export/home/report" } END{ echo hogehoge > $[A]"/test.txt" } }'

  • AWkの配列についてのデバッグ

    awkプログラミングを勉強しています。配列を使ったスクリプトがうまく動作しないのでネットで検索していると"配列を使っていてうまく動かない場合、awk コマンドの引数に --dump-variables を指定することで、利用している変数および配列の一覧を awkvars.out というファイルに出力することができます。” という書き込みを見つけました。この機能を使用してみたいのですが、うまくいきません。 スクリプトに #!/nin/awk -f --dump-variables としてもなにも特別な動作はしてくれませんでした。

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

  • [awk]2つのファイルを参照して1つのファイルに出力する方法

    最近プログラミング(シェル、awk)を始めた者です。 かなり大まかなものは作れるようになったのですが、急遽、大規模なデータ整理を行わないといけなくなってしまったため、皆さんの知恵を貸していただきたく質問いたしましたm(_ _)m 以下に示すような2つのファイルがあります。 (file1)         (file2) 1 6           1  1  2  10 11 2 3           2  3  5  7  8 3 5           3  6  2  12 13 4 1           4  9  4  5  19 5 2           5  10 19 1  5 6 4           6  4  8  2  9 file1を上から1行ずつ順に読んでいき、2列目の値と同じものをfile2の1列目から探します。合致したところで、file2の合致した行の2列目以降を行番号を付けて表示するというものです。 (「file1の2列目の値=file2の1列目の値」を探し、file2の合致行の値を出力。) 上記ファイルですと、結果的に 1  4  8  2  9 2  6  2  12 13 3  10 19 1  5 4  1  2  10 11 5  3  5  7  8 6  9  4  5  19 という具合になります。 2つのファイルの行数は同じではなく、また、両ファイルとも1列目が行番号というだけで、他の列の値に規則性はありません。 file2の行数は100万以上の大規模なものになります。 自分が作ったものを掲載できればよかったのですが、あいにく会社のPC内にありまして、持ち出しできないため、掲載できません。 動作環境はLinux(RedHat)になります。 他のプログラミング言語についてはまだ分からないため、awkもしくはシェルでお願いいたします。

  • awkのBEGINについて

    awkのBIGIN内で、データファイルの途中のレコード情報を取得することは可能でしょうか? 以下が行いたい詳細です。 下記例のテキストファイルの”DATE”行をawkスクリプトファイルのBEGIN内で取得したい。 例:test.txt 11111 22222 33333 DATE=20040706 44444 よろしくお願いいたします。

  • awkで、キーボードからファイルを指定するには

    私は、awkプログラムを始めたばかりの初心者です。 データファイルがfile1、file2、file3とあって、どのファイルを実行させたいかをキーボードから入力させるには、どのようにすればよいのでしょうか。 次のようなプログラムを作ったのですが、うまくいきません。 { printf "ファイル名?" > "/dev/stderr"#画面表示 getline < "/dev/stdin" #数字入力 aaa = $0 #aaaに代入 } { getline < ("file"aaa".txt") #ファイル入力 print $0 #レコードを出力 } これを、バッジファイルで次のように実行をかけて、「結果.txt」に出力する。 jgawk -f prog.awk con > 結果.txt すると、コマンド画面が消えず、エラーとなってしまいます。 バッジファイルに問題があるのでしょうか。 「-f」の後には、プログラム名、データ名>出力ファイル名 とやるようですが、この場合、データ名が決まっていないわけで、キーボード入力したいのだから、「con」でいいのでしょうか。 プログラムを実行させるのに、ほかに良い方法があるのでしょうか。

  • AWKスクリプトの入力ファイルについて

    AWKスクリプトで入力ファイルを複数使用することは 可能でしょうか? 実際にやりたいことは 例えば ファイル1 NQN PQP RPO ファイル2 MN NQN MP PQP R RPO というような2種類のファイルがありファイル1が実際に処理をする入力ファイル でファイル2が対応表に該当するファイルです。 ファイル1とファイル2を読み込んで ファイル1を NQN MN PQP MP RPO R というように加工して出力したいのですが AWKでこういった処理は可能なのでしょうか?

  • 別のファイルに集計をしたい、関数でできますか

     画像にあるような表が2つあります。それぞれ別のファイルです。左側のファイルのデーターを右のファイルへ集計したいのですが、どのような関数でやったらできるでしようか、お教え下さい。  左のファイルは、半分隠れていますが、6つのsheetがあります。見えているsheetを右にあるようにしたい訳です。右の費用金額欄に「0」(ゼロ)のところがありますが、ここは詰めて集計したいです。当然のことながら、月のところもそれに呼応して費用があるところだけ表示させたいのです。小計・総合計もできれば、sumt関数で合計を出したいと思います。後右のファイルには、整骨院とか田中歯科とかの病院名・山田太郎などの氏名も表示させたいと思っています。なお、月ごとの合計が右のファイルに表示できる集計表ができればいいのです。  条件が多くてできますか、よろしくお願い致します。画像が荒いかもしれません、初心者で申し訳ありません。

専門家に質問してみよう