Awk
平均文件的一列
我有一個 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]