クラスの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
私は近いと思いますが、ここからどこに行くべきか本当に分かりません。クラスで見たすべてがかなり基本的なものであるため、コードは信じられないほど複雑であってはなりません。私にお知らせください。
あなたの特定のエラーは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行の入力があることを確認することを追加します(これにより、ゼロによる除算エラーが停止します)。もし
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 }'
これを試して:
ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}'
NRは、noをカウントするAWK組み込み変数です。記録の
awk 's+=$2{print s/NR}' table | tail -1
私はtail -1
を使用して、平均数が必要な最後の行を印刷しています...