我有一个 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
问题是什么?
for (i = 13)
根本不是一个有效的 awk 构造。(我真的需要告诉你,这for i = 13)
甚至在语法上都不是有效的吗?)该for
语句有两个版本:for (expr1; expr2; expr3) statement
for (var in array) statement
看起来您正在尝试使用第一个 ( )。如果您想查看所有 17 个字段,您可以使用, 或者更好的是. 如果您只想处理字段 #13 但保留循环结构,您可以使用. 但是,如果你想要简单、直接的代码来完成这项特定的工作,你可以使用
for (expr1; expr2; expr3) statement
for (i = 1; i <= 17; i++)
for (i = 1; i <= NF; i++)
for (i = 13; i <= 13; i++)
i = 13; if ($i != -999) {sum[i] += $i; num[i]++}
,if ($13 != -999) {sum[13] += $13; num[13]++}
, 或者if ($13 != -999) {sum += $13; num++}
...因为如果您只处理一列,则不需要数组。
而且,正如“他们”所评论的那样,它看起来非常像您在双引号中运行 awk 的程序。如果你使用单引号,事情会好得多。
如果您想为第 9 列中的每个单独值平均第 13 列中的数字,则无需为第 9 列中的每个值创建单独的文件。只需跟踪单独的总和并在最后输出它们。
您的代码的主要问题是您编写
for
循环的方式存在语法错误。for
根本不需要循环,因为我们只访问第 13 列。循环有
for
两种风格awk
。你有“算术for
循环”,这是你可能想要使用的。它通常使用来自某些初始化的计数器进行迭代,直到某些逻辑测试不再为true,并进行一些更新:例如
另一种类型是我在上面的答案中显示的,它用于迭代数组的索引。请注意,循环可能不会以任何特定顺序遍历索引。
例如