awk で平均を算出する方法
目次
スポンサードリンク
awk の基本構文
awk をワンライナーで実行する場合の基本構文は以下の通りです。 引数で指定したファイル、または、標準入力で指定したデータを対象とし、パターンにマッチした行に対し、処理を実行します。パターンは省略でき省略時は全ての行が対象になります。
awk パターン { 処理 } ファイルパス
コマンド | awk パターン { 処理 }
使用するサンプルデータ
サンプルで使用するデータは、以下のように数値が半角スペースで区切られて並んでいます。 この数値を各行毎、各列毎に平均値を求めてみます。
[root@hostname tmp]# cat data
1 2 3 4 5
10 20 30 40 50
-10 -20 -30 -40 50
列毎に値を合算し平均を求める方法
列毎の平均値を求める際は、各列の値を合算した上で、その値をデータの行数で割ります。 行数は、awk のビルトイン変数 NR(Number of Records)を使います。NR には現在処理しているレコードの行番号が入ります。
以下の例は、awk ‘{ sum += $4 } の部分で4列目の値を合算しています。END の後の処理 { print sum / NR } は、最後に一度だけ実行される処理で、 実行するタイミングでは、NRに最後のレコードの行番号が入っています。NRで割ると平均を求めることができます。他の列の平均値を求めたい場合は、$4 の数字を変更します。
[root@hostname tmp]# cat data | awk '{ sum += $4 } END { print sum / NR }'
1.33333
行毎に値を合算し平均を求める方法
行毎の平均値を求める際は、各行の値を合算した上で、その値をデータの列数(フィールドの数)で割ります。 列数は、awk のビルトイン変数 NF(Number of Fields) を使います。NF には現在処理しているレコードの列数が入ります。
以下の例は、awk ‘{ sum=0; for (i=1; i<=NF; i++) { sum+=$i } で各行の合計を求め変数sumに格納しています。 print文で変数sumの値をフィールド数で割った値を表示しています。
[root@hostname tmp]# cat data | awk '{ sum=0; for (i=1; i<=NF; i++) { sum+=$i } print sum/NF; }'
3
30
-10
プログラミング言語AWK
AWK 言語作者による解説本。名著。
Linuxコマンドについて学べるおすすめ書籍
Linuxコマンドの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。
関連記事
Search
Recent Posts
- カーネル更新やパッケージのパッチ適用後、OSの再起動が必要か確認するLinuxコマンド(needs-restarting)
- OpenSSHのエラー「bad ownership or modes for chroot directory component」の原因と解消方法
- Apacheの起動状態をチェックして停止してる場合にApacheを起動するシェルスクリプト
- Amazon LinuxのOSバージョンを調べる方法|/etc/redhat-release の代替ファイル
- MYSQLでダンプファイルを取得する際に発生したエラー「Couldn't execute 'SELECT BINLOG_GTID_POS('', '0')': You are not using binary logging (1381)」の原因と対処方法