- ベストアンサー
awkについて
awkの勉強を始めました。入力ファイルから特定の行を抜き出し、平均値を求めようとしています。しかし、FNRとはファイルの全行のようで、FNRで割ると正しい値になりません。特定の文字($8="abc")の行だけ抜き出しているので行数は全体より小さいのですが、抜き出した行数で割るにはどうすればよいのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
特定の行のみ処理するにしてもその方法ではうまくいかないと思いますけど。 BEGIN{ goukei = 0 count = 0 } { #フィールドの8番目の条件が一致する場合のみ9番目を合計 if($8=="○○○"){ goukei += $9 count++ } } END{ if(count!=0){ print "合計は", goukei print "平均は", goukei/count } else{ print "条件に一致するのない” } } 基本的にPerlとかのスクリプト言語と同じです。 if関数やユーザー定義の変数をうまく使って、合計値の他にその条件に一致した回数もカウントしてやればいいだけ。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
awk '$8=="abc"' | awk '{total+=$9}; END{print "total=", total;print "mean=", total/FNR}' とか。 #1の方の回答は要するにこういうことではないでしょうか。 結局のところ、今回平均値を求めるのに必要な標本の数は自分で数えるよりしょうがないのですから。
- splwtr
- ベストアンサー率16% (75/461)
バラバラにして考えると、UNIX的な使い方です。 awkのスクリプトで抜き出し、その結果をパイプかファイル渡しで 集計する。抜き出した件数をawkで求めるより、wc -lで求めた方が 楽と思います。 抜き出す/合計するを、分割した場合の考え方です。
補足
ご回答有り難うございました。教えて頂いたやり方でやるには、コマンドラインから実際にはどのように入力すればよいでしょうか。ちなみに、今のawkスクリプトは以下のような感じです。 BEGIN{ } $8=="あいうえお"{ goukei+=$9 } END{ print "合計は", goukei print "平均は", goukei/?? } やはりawkでやるとすると複雑になりますでしょうか?
お礼
期待した値が出力出来るようになりました。 ありがとうございました。