なぜ三重印刷ですか?

なぜ三重印刷ですか?

私は同じ行を何度も印刷するこのスクリプトを書いています。一度だけ印刷したい場合はどうすればよいですか?

BEGIN {print "Average of salary"}
cnt=cnt+1
total=total+$3
avg=total/cnt
END {printf "Number of records:%d avg is:%d",cnt,avg}

答え1

問題は、以下のように、下のコードを中括弧で囲むのではなく、awkTrueステートメントを満たして読み取るすべての行を印刷することです。

{
    cnt=cnt+1
    total=total+$3
    avg=total/cnt
}

しかし、次のようにすることができます。

awk '{ avg=(total+=$3)/NR } END{ print "...", NR, avg }' <infile

この値は、入力ファイルから読み取られたすべてのレコード/行で増加しますNRawkアッすべての行を読み取り、その値はNR最後の行の行番号です(デフォルトでは、次を指します)。エココード窒素数字)

答え2

あなたはほぼ成功しました。

たとえば、計算された行を{}で囲みます。

BEGIN { ...}
{ compute goes here}
END { printf "..."}

なぜ三重印刷ですか?

このようなすべての割り当てはfoo=$3+fooawkのアクティブテストであり、基本的な作業はその行を印刷することです。

END(ところで、節の平均を計算するだけです)

関連情報