- ベストアンサー
awkを使いプログラミングを始めたばかりの初心者です。
プログラミングを始めたばかりの初心者です。 awkを使い以下のような値の平均値、最大値を表示する プログラム作りたいのですがうまくいきません。 値1 値2 値3 2546 2543 6535 5345 6355 3547 32 43 44 23547 57625 66426 出力イメージは以下のような感じです。 値1 値2 値3 平均 **** **** **** 最大値 **** **** ****
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 平均値は出せたのですが、最大値はうまく出ませんでした。 > 実際に読み込む値には",”がついているのが原因かと思いますが > 5桁の値があるにもかかわらず4桁の値が表示されていました。 そういう、条件の後出しはできれば止めていただけるとありがたいです。 質問文の例で挙げられているデータには カンマなんてないですよね? 二度手間、三度手間になるのはお互い不幸です。 平均値の方は正しい値になったというのは良くわかりませんが、 123,456 のようにカンマつきのフォーマットで 数値が表されているということであれば、 カンマを除去してから処理すれば良いです。 { for (i=1; i<=NF; i++) { sum_of[i-1] += $i if (max_of[i-1] < $i) max_of[i-1] = $i } } この辺を tmpnum = $i gsub(/,/, "", tmpnum) sum_of[i-1] += tmpnum if (max_of[i-1] < tmpnum) max_of[i-1] = tmpnum とか。 #フィールドを直接書き換えるのはオススメしません
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
NR==1{ for (i=1; i<=NF; i++) labels[i-1] = $i field_count = NF; next } { for (i=1; i<=NF; i++) { sum_of[i-1] += $i if (max_of[i-1] < $i) max_of[i-1] = $i } } END { for (i=0; i<field_count; i++) { l1 = length((max_of[i] "")) l2 = length(sprintf("%.3f", sum_of[i] / (NR-1)) l = (l1 >= l2) ? l1 : l2 if (max_width < l) max_width = l } fmt_avg = sprintf("%%%d.3f", max_width+1) fmt_max = sprintf("%%%dd", max_width+1) fmt_head = sprintf("%%%ds", max_width+1) row_head1 = " " row_head2 = "平均 " row_head3 = "最大値" printf("%s ", row_head1) for (i=0; i<field_count; i++) printf(fmt_head, labels[i]) print "" printf("%s ", row_head2) for (i=0; i<field_count; i++) printf(fmt_avg, sum_of[i] / (NR-1)) print "" printf("%s ", row_head3) for (i=0; i<field_count; i++) printf(fmt_max, max_of[i]) print "" } 結果 値1 値2 値3 平均 7867.500 16641.500 19138.000 最大値 23547 57625 66426 多分1行目とそのあとがずれて表示されると思いますが、 スクリプトは桁揃えするように出力しています。 同じようなループを何回もやっていやになりますが、 awkはPerlとかRubyあたりに比べれば多芸でないので まあこんなもんかと。
お礼
回答ありがとうございます。 平均値は出せたのですが、最大値はうまく出ませんでした。 実際に読み込む値には",”がついているのが原因かと思いますが 5桁の値があるにもかかわらず4桁の値が表示されていました。
- maku_x
- ベストアンサー率44% (164/371)
うまくいかないプログラムを載せてもらったほうが、回答する方としては分かりやすいのですが。 ひとまず、以下の例でうまくいきませんか。 BEGIN { FS=" "; f_max=0; lin=0 } { if (f_max < NF) { f_max = NF; } for (i=1; i<=NF; i++) { n_sum[i] += $i; if (n_max[i] < $i) { n_max[i] = $i; } } lin++ } END { for (i=1; i<=f_max; i++) { printf("%d ", n_sum[i]/lin); } printf("\n"); for (i=1; i<=f_max; i++) { printf("%d ", n_max[i]); } printf("\n"); }
お礼
申し訳ありませんでした。 おかげさまで何とかなりました。 ありがとうございました。