web-dev-qa-db-ja.com

awkを使用して列の平均を見つける

クラスのawkを使用して、データの2番目の列の平均を見つけようとしています。これは私のインストラクターが提供したフレームワークを備えた私の現在のコードです:

#!/bin/awk

### This script currently prints the total number of rows processed.
### You must edit this script to print the average of the 2nd column
### instead of the number of rows.

# This block of code is executed for each line in the file
{
x=sum
read name
        awk 'BEGIN{sum+=$2}'
        # The script should NOT print out a value for each line
}
# The END block is processed after the last line is read
END {
        # NR is a variable equal to the number of rows in the file
        print "Average: " sum/ NR
        # Change this to print the Average instead of just the number of rows
}

そして、私は言うエラーを受け取っています:

awk: avg.awk:11:        awk 'BEGIN{sum+=$2}' $name
awk: avg.awk:11:            ^ invalid char ''' in expression

私は近いと思いますが、ここからどこに行くべきか本当に分かりません。クラスで見たすべてがかなり基本的なものであるため、コードは信じられないほど複雑であってはなりません。私にお知らせください。

47
Ben Zifkin

あなたの特定のエラーは11行目です:

awk 'BEGIN{sum+=$2}'

これはawkが呼び出され、そのBEGINブロックが指定されている行です-ただし、すでにawkスクリプト内にいるので、awkを指定する必要はありません。また、入力の各行でsum+=$2を実行する必要があるため、BEGINブロック内で実行しないでください。したがって、この行は単純に次のようになります。

sum+=$2

次の行も必要ありません。

x=sum
read name

最初はsumという同義語をxという名前で作成するだけで、2番目が何をするのかわかりませんが、どちらも必要ありません。

これにより、awkスクリプトが作成されます。

#!/bin/awk

### This script currently prints the total number of rows processed.
### You must edit this script to print the average of the 2nd column
### instead of the number of rows.

# This block of code is executed for each line in the file
{
    sum+=$2
    # The script should NOT print out a value for each line
}
# The END block is processed after the last line is read
END {
    # NR is a variable equal to the number of rows in the file
    print "Average: " sum/ NR
    # Change this to print the Average instead of just the number of rows
}

ジョナサンレフラーの答えは、同じ固定コードを表す1つのライナーをawkに与え、少なくとも1行の入力があることを確認することを追加します(これにより、ゼロによる除算エラーが停止します)。もし

9
imp25
awk '{ sum += $2; n++ } END { if (n > 0) print sum / n; }'

$2(2番目の列)の数値をsum(変数はawkによって自動的にゼロに初期化されます)を追加し、行数をインクリメントします(組み込みで処理することもできます)変数NR)。最後に、少なくとも1つの値が読み取られた場合、平均を出力します。

awk '{ sum += $2 } END { if (NR > 0) print sum / NR }'

Shebang表記を使用する場合は、次のように記述できます。

#!/bin/awk

{ sum += $2 }
END { if (NR > 0) print sum / NR }

printf()および適切な形式(たとえば、"%13.6e\n")で平均の形式を制御することもできます。

次を使用して、コードを一般化してN番目の列を平均化することもできます(このサンプルではN=2を使用)。

awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum / NR }'
107

これを試して:

ls -l  | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}'

NRは、noをカウントするAWK組み込み変数です。記録の

3
Pradipta
awk 's+=$2{print s/NR}' table | tail -1

私はtail -1を使用して、平均数が必要な最後の行を印刷しています...

1
iamauser