タイムスタンプデータを含むCSVファイルと、毎月別々のファイルに分割するスクリプトがあります。このスクリプトはその月のデータを取得し、平均を単一の値として計算します。コードの一部は次のとおりです。他のすべての月は1月の最初の月と同じです。このコードは、1年の長さのファイルを9列に基づいて数ヶ月(1〜12月)に分割し、17フィールドすべてを印刷します。次のコード行は列13を表示し、ファイル内のすべてのデータ(欠落データを無視、-999と指定)の平均を計算し、列平均を新しい$ i.monthlyavgファイルに印刷します。
awk -F ',' '$9= 1 {print $0}' $i > Jan.tmp
awk 'NR > 1 { for i = 13) if ($i != -999) {sum[i] += $i; num[i]++}
END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }' Jan.tmp > $i.monthlyavg
次のエラーメッセージが表示されます...
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: NR > 1 { for i = 13) if (01-073-1003-SO2-1998.dat.out != -999) {sum[i] += 01-073-1003-SO2-1998.dat.out; num[i]++}
awk: cmd. line:1: ^ syntax error
そして
END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2: ^ syntax error
awk: cmd. line:2: END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2: ^ syntax error
awk: cmd. line:2: END { for (i = 13) print i, sum[i], num[i], sum[i]/num[i] }
awk: cmd. line:2: ^ unexpected newline or end of string
問題は何ですか?
ベストアンサー1
9列の個々の値ごとに13列の数値平均を取得したい場合は、9列の各値に対して別々のファイルを作成する必要はありません。個々の合計を追跡し、最後にすべてを出力します。
awk -F, '
$13 != -999 { s[$9] += $13; n[$9]++ }
END { for (i in s) print i, s[i]/n[i] }' some-file
コードの主な問題は、ループの作成方法に構文エラーがあることですfor
。for
列 13 のみにアクセスするので、ループはまったく必要ありません。
ループfor
には2つのスタイルがありますawk
。for
おそらく使用したい「算術ループ」があります。通常、カウンタを使用していくつかの初期化から始まり、いくつかのロジックがテストされなくなるまで繰り返されます。本物、いくつかのアップデート:
for (initialization; logical-test; update) statement
例えば
for (i = 1; i <= NF; ++i) print i
他の型は上記の回答で示した型で、配列のインデックスを繰り返すために使用されます。ループは特定の順序でインデックスを繰り返すことはできません。
for (index-variable in array) statement
例えば
for (key in data) print key, data[key]