Awk 如何计算特定列的月平均数和年平均数?

Awk 如何计算特定列的月平均数和年平均数?,awk,Awk,我有一个CSV文件,有六年的April和May月份的温度数据。我想计算每年每个月的平均值。我正在使用awk命令,但它显示0输出。我不知道如何使用awk命令解决这个问题。我用这个脚本来解决这个问题 $ mawk ' NR>1 { split($5,d,"/"); s[d[3]"/"d[1]]+=$6; c[d[3]"/"d[1]]++; } END { for (i in s) print i, s[i]/c[i]; }' DELHI_IMD1618.csv 输入片段: Stn I

我有一个CSV文件,有六年的
April
May
月份的温度数据。我想计算每年每个月的平均值。我正在使用
awk
命令,但它显示0输出。我不知道如何使用awk命令解决这个问题。我用这个脚本来解决这个问题

  $ mawk ' NR>1 { split($5,d,"/"); s[d[3]"/"d[1]]+=$6; c[d[3]"/"d[1]]++;
  } END { for (i in s) print i, s[i]/c[i]; }' DELHI_IMD1618.csv
输入片段:

Stn ID Lat     Long time(GMT) DATE TEMPERATURE
IMDE1615_14164F(NAJAFGARH),28.63,77.01,2,04/01/2012,32
IMDE1615_14164F(NAJAFGARH),28.63,77.01,15,04/04/2012,32.7
IMDE1615_14164F(NAJAFGARH),28.63,77.01,6,05/01/2012,35.2
IMDE1615_14164F(NAJAFGARH),28.63,77.01,7,05/01/2012,36
IMDE1615_14164F(NAJAFGARH),28.63,77.01,8,05/01/2012,36.1
IMDE1615_14164F(NAJAFGARH),28.63,77.01,0,04/02/2013,28.7
IMDE1615_14164F(NAJAFGARH),28.63,77.01,1,04/02/2013,28.6
05/2012 35.7667
04/2012 32.35
04/2013 28.65
我想要这样的输出

04/2013 mean
05/2013 mean
04/2014 mean
gawk解决方案:

awk -F, 'NR>1{ split($5,a,"/"); k=a[1]"/"a[3]; data[k]["c"]++;  data[k]["s"]+=$6 }
         END{ for(i in data) print i,data[i]["s"]/data[i]["c"] }' DELHI_IMD1618.csv
示例性输出(针对您的输入片段):


详情:

  • -F,
    -字段分隔符

  • 拆分($5,a,“/”)
    -按
    /
    拆分“日期”列

  • k=a[1]“/”a[3]
    -形成关联数组的复合键(即
    “04/2012”

  • 数据[k][“c”]+
    -增加分组项目的数量(
    “c”
    -“计数”)

  • 数据[k][“s”]+=$6
    -累积温度列值

  • 数据[i][“s”]/data[i][“c”]
    -计算平均值


日期格式是mm/dd/yyyy,当我运行上面的脚本时,它会显示如下错误。awk:第1行:语法错误在或接近[awk:第1行:语法错误在或接近[awk:第1行:语法错误在或接近[@VaibhavKumar,使用标准的awk实现它肯定会工作脚本只是由于真正的多维数组语法而呆滞。您需要
数组[“foo”,“bar”]
而不是
数组[“foo”[“bar”]
语法(加上一些调整)使其在任何awk中都能工作。您无法从发布的示例输入中获得该输出。请修复它,这样我们就不会猜测了。如果第一个字段包含类似斜杠的
IMDE1615_14164F(N/AJAFGARH)将不起作用
也不包含逗号、换行符或…但这些都不存在于发布的样本中,我怀疑它们是否存在于真实数据中,因此没有必要尝试处理不存在的案例。如果样本存在问题,OP始终可以修复其样本。
$ cat tst.awk
BEGIN { FS="[,/]" }
NR==1 { next }
{ date=$5"/"$7 }
date != prev { prtMean(); prev=date }
{ sum+=$8; cnt++ }
END { prtMean() }

function prtMean() {
    if (cnt) {
        print prev, sum / cnt
        sum = cnt = 0
    }
}

$ awk -f tst.awk file
04/2012 32.35
05/2012 35.7667
04/2013 28.65