質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

1回答

2418閲覧

awkを使って平均点を出すと思っているものと違う結果が出てしまう

terataillll

総合スコア2

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2020/08/31 02:31

編集2020/08/31 03:42

前提・実現したいこと

太郎 50 70
次郎 58 56
三郎 64 67
と書かれたファイルを読み込んで
合計が120以上の人は〇〇さんは合格ですと、そしてその後に全員の平均(小数第1位まで)が出るようにしたい。

つまり

太郎さんは合格です
三郎さんは合格です
平均は121.7点です

こういう結果が出るようにしたいのですがうまくいっていません。
どなたか助けていただきたいです。~~~

今私が作っているものはこう返ってきてしまう

太郎さんは合格です 平均は120点です 次郎さんは合格です 平均は83点です

該当のソースコード

#!/bin/sh awk ' $2 + $3 >= 120{ printf("%sさんは合格です\n",$1) m+=$3 n+=$2 printf("平均は%.1f点です\n",((m+n)/NR)) }' $1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、問題定義と結果の例があやふやですね。

「合計が120の人」→「合計が120点以上の人」だとして、想定される結果は、

results

1太郎さんは合格です 2三郎さんは合格です 3平均は125.5点です

なのでは。次郎さんは114点なので不合格ですよね。

次に、合格した人の(2つの数値の合計の)平均点を最後に出すには、合格した人だけの合計点と人数を数えておいて、すべての入力が終わった後で計算と表示を行なう必要があります。

awk

1$2 + $3 >= 120 { 2 print $1 "さんは合格です" 3 total += $2 + $3 4 member += 1 5} 6END { 7 printf("平均は%.1f点です\n", total/member) 8}

追加分:
全員の(2つの数値の合計の)平均点を最後に出すのであれば、

awk

1{ 2 if ($2 + $3 >= 120) { 3 print $1 "さんは合格です" 4 } 5 total += $2 + $3 6} 7END { 8 printf("平均は%.1f点です\n", total/NR) 9}

としてください。この場合に得られる結果は以下のようになります。

results

1太郎さんは合格です 2三郎さんは合格です 3平均は121.7点です

投稿2020/08/31 03:10

編集2020/08/31 03:34
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/08/31 03:15

全員の平均ではなく合格者の平均になりますね。
Daregada

2020/08/31 03:18

そもそも、「誰に対する何の平均点か」が明確に定義されていないんですよね。
Zuishin

2020/08/31 03:22

そうですね。質問者は書いていないので、問い合わせて確定するか、回答者側でこのように決めたことを説明するのがいいのではないかと思いました。
terataillll

2020/08/31 03:23

返信ありがとうございます! すみません!いろいろ間違えていました。。。 平均は3人全員の分を出したいです。
Daregada

2020/08/31 03:23

というわけで記述を追加しました。
terataillll

2020/08/31 03:31

#!/bin/sh awk ' $2 + $3 >= 120{ if ($2 + $3) { printf("%sさんは合格です\n",$1) } total += $2 + $3 }END{ printf("平均は%1.d点です\n",(total/NR)) }' $1 と変更してみたのですが平均点が合わないです. 121.7が正しいのですが83という結果になります。 awkを理解できていないと思うのでわかりやすく教えていただけませんか...?
Daregada

2020/08/31 03:35

$2 + $3 >= 120 { ... } と書くと、{ ... }の処理は、その前の条件が成立した場合だけ処理されます。 今回は全員の点数をtotalに追加していきたいので、「$2 + $3 >= 120」を取り除いてください。それから、if文の条件式の後半が抜けていたので、修正した回答のように「>= 120」を追加してください。
terataillll

2020/08/31 03:40

理解しました!できました!ありがとうございます!!!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問