- ベストアンサー
awkで複数ファイルをそれぞれ集計し、一つのファイルに出力するには
awkプログラミングを始めたばかりの初心者です。複数ファイルのデータをそれぞれ集計し、一つのファイルに出力するにはどのようなスクリプトを作ればよいのでしょうか。 例 [file1]10,20,30 [file2]20,30,40 [file3]30,40,50 それぞれのファイルの中にある数字を合計して、別のファイル(file4)に一覧表示させる。 ↓ [file4]60 90 120
- みんなの回答 (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]] } }
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
各ファイル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
補足
回答していただいたのですが、私は、初心者のため、awkを実行させるのに、「jgawk -f "プログラム名" "データ名" > "結果表ファイル名"」と、バッジファイルを作って実行させるやり方しか知りません。notnotさんに提示していただいたスクリプトは、どのようにして実行させればよいのでしょうか。 また、各ファイルが複数行ある場合、どのようにすればよいのでしょうか。
- utf7
- ベストアンサー率29% (11/37)
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さんの挙げた例に即せば、これで十分だと思います。
お礼
参考になりました。回答していただき、ありがとうございました。
お礼
提示していただいたプログラムを意味が分かるまで何度も読み返しました。「なるほど」と思う事がいくつもあり、まだまだ初心者ですが、プログラムを作る楽しさが分かってきました。丁寧に教えていただき、ありがとうございました。