当使用awk在不同列中更改数字的值时,查找列中数字的平均值

时间:2015-09-12 06:00:13

标签: awk

我有一个看起来像的文件:

      7 8108 1571 7769 4.34 96.19 NaN 186.07
      7 8108 1571 7770 4.28 99.11 NaN 190.88
      7 8108 1571 7771 2.26 102.85 NaN 196.68
      7 8108 1571 7772 3.47 102.92 NaN 198.78
      7 8108 1571 7773 3.52 105.92 NaN 210.46
      7 8108 1571 7774 4.99 103.15 NaN 211.16
      7 8108 1571 7775 5.80 101.74 NaN 215.09
      7 8108 1571 7776 3.44 101.13 NaN 213.64
      7 8107 1571 1 24.20 3049.37 47.74 201.60
      7 8107 1571 2 25.43 3197.89 41.10 203.77
      7 8107 1571 3 20.39 3204.50 58.53 201.34
      7 8107 1571 4 29.77 3237.13 59.81 189.35
      7 8107 1571 5 25.15 3101.98 61.84 174.00
      7 8107 1571 6 28.57 3478.38 69.62 180.99
      7 8107 1571 7 27.33 3313.49 62.96 164.91
      7 8107 1571 8 25.20 3447.72 56.84 166.96
      7 8107 1571 9 21.74 3613.38 60.16 170.33

每当第2列中的值发生变化时,我想计算第5列中所有值的平均值,然后在第5列中为第2列中的每个值打印出所有平均值。

请帮忙。

3 个答案:

答案 0 :(得分:2)

$ awk '{s[$2]+=$5; n[$2]++;} END{for (k in s) print k,s[k]/n[k];}' file
8107 25.3089
8108 4.0125

如何运作

代码使用两个关联数组。 s包含第2列每个值的第5列的总和。n包含每列2出现的次数。

  • s[$2]+=$5; n[$2]++

    对于第2列的此值,将第5列添加到总和s,并在行数n中添加一个。

  • END{for (k in s) print k, s[k]/n[k];}

    当我们到达文件末尾时,循环浏览我们看到的第2列的每个值k并打印出平均值s[k]/n[k]

对输出进行排序

要通过输出的第一列(输入的第2列)以数字方式对输出进行排序:

$ awk '{s[$2]+=$5; n[$2]++;} END{for (k in s) print k,s[k]/n[k];}' file | sort -n
8107 25.3089
8108 4.0125

按数值排序平均值:

$ awk '{s[$2]+=$5; n[$2]++;} END{for (k in s) print k,s[k]/n[k];}' file | sort -nk2
8108 4.0125
8107 25.3089

答案 1 :(得分:0)

这保存在第2列索引的数组tot中, 并在num计数。

awk '{ tot[$2] += $5; num[$2]++ }
END{ for(i in tot)printf "%s %s\n",i,tot[i]/num[i] }'

答案 2 :(得分:0)

$ cat tst.awk
$2!=prev { if (cnt) print prev, sum/cnt; sum=cnt=0 }
{ sum+=$5; cnt++; prev=$2 }
END { if (cnt) print prev, sum/cnt }

$ awk -f tst.awk file
8108 4.0125
8107 25.3089