• ベストアンサー

awkについて

awkの勉強を始めました。入力ファイルから特定の行を抜き出し、平均値を求めようとしています。しかし、FNRとはファイルの全行のようで、FNRで割ると正しい値になりません。特定の文字($8="abc")の行だけ抜き出しているので行数は全体より小さいのですが、抜き出した行数で割るにはどうすればよいのでしょうか。

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

  • ベストアンサー
  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.2

特定の行のみ処理するにしてもその方法ではうまくいかないと思いますけど。 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関数やユーザー定義の変数をうまく使って、合計値の他にその条件に一致した回数もカウントしてやればいいだけ。

参考URL:
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/
rio_grande
質問者

お礼

期待した値が出力出来るようになりました。 ありがとうございました。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

awk '$8=="abc"' | awk '{total+=$9}; END{print "total=", total;print "mean=", total/FNR}' とか。 #1の方の回答は要するにこういうことではないでしょうか。 結局のところ、今回平均値を求めるのに必要な標本の数は自分で数えるよりしょうがないのですから。

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.1

バラバラにして考えると、UNIX的な使い方です。 awkのスクリプトで抜き出し、その結果をパイプかファイル渡しで 集計する。抜き出した件数をawkで求めるより、wc -lで求めた方が 楽と思います。 抜き出す/合計するを、分割した場合の考え方です。

rio_grande
質問者

補足

ご回答有り難うございました。教えて頂いたやり方でやるには、コマンドラインから実際にはどのように入力すればよいでしょうか。ちなみに、今のawkスクリプトは以下のような感じです。 BEGIN{ } $8=="あいうえお"{ goukei+=$9 } END{ print "合計は", goukei print "平均は", goukei/?? } やはりawkでやるとすると複雑になりますでしょうか?

関連するQ&A

専門家に質問してみよう