如何用Awk/Bash平均一行的重复间隔

  • 本文关键字:一行 Awk 何用 Bash bash awk
  • 更新时间 :
  • 英文 :


我有一个txt文件,显示了1749年至2005年期间一年中每个月的平均太阳黑子数据。

(* Month: 1749 01 *) 58
(* Month: 1749 02 *) 63
(* Month: 1749 03 *) 70
(* Month: 1749 04 *) 56
(* Month: 1749 05 *) 85
(* Month: 1749 06 *) 84
(* Month: 1749 07 *) 95
(* Month: 1749 08 *) 66
(* Month: 1749 09 *) 76
(* Month: 1749 10 *) 76
(* Month: 1749 11 *) 159
(* Month: 1749 12 *) 85
(* Month: 1750 01 *) 73
(* Month: 1750 02 *) 76
(* Month: 1750 03 *) 89
(* Month: 1750 04 *) 88
Etc.

我需要平均每年的12个月。因此1749应该等于81。用awk平均6美元似乎很简单。

awk ' {sum += $6} 
END { print sum/ NR } ' sunspot.txt

然而,我不知道从哪里开始,使用Awk的控制结构来逐步平均1749年至2005年间的12个数字。

这里有一种方法:

awk '{a[$3] += $6; b[$3] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n

以下显示了先按月份平均,然后按年份平均的情况,以供说明。这是使用awk的内置阵列功能;a";数组存储总和;b";保持一个增量计数,该计数在结束时用于对和进行除法以计算平均值。

$ awk '{a[$4] += $6; b[$4] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
01 65.5
02 69.5
03 79.5
04 72
05 85
06 84
07 95
08 66
09 76
10 76
11 159
12 85
$ awk '{a[$3] += $6; b[$3] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
1749 81.0833
1750 81.5

最新更新