Awk

平均文件的一列

  • February 13, 2022

我有一個 CSV 文件(帶有時間戳數據),我有一個腳本,可以將一年中的每個月分成一個單獨的文件。該腳本將花費該月並將數據平均為單個值。部分程式碼如下;所有其他月份將與一月份的第一個月份相同。該程式碼將根據第 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

問題是什麼?

如果您想為第 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兩種風格awk。你有“算術for循環”,這是你可能想要使用的。它通常使用來自某些初始化的計數器進行迭代,直到某些邏輯測試不再為true,並進行一些更新:

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]

引用自:https://unix.stackexchange.com/questions/690427