如何使用 Awk/Bash 平均一行的重复间隔
How to average a repeating interval of a row with Awk/Bash
我有一个 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 += }
END { print sum/ NR } ' sunspot.txt
但是,我不知道从哪里开始使用 Awk 中的控制结构对 1749 年到 2005 年之间的 12 个数字中的每一个数字进行增量平均。
这是一种方法:
awk '{a[] += ; b[] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
为了说明,下图首先按月平均,然后按年平均。这是使用 awk 的内置数组功能 - 其中“a”数组存储总和,“b”保留增量计数,最后用于总和的除以计算平均值。
$ awk '{a[] += ; b[] += 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[] += ; b[] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
1749 81.0833
1750 81.5
我有一个 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 += }
END { print sum/ NR } ' sunspot.txt
但是,我不知道从哪里开始使用 Awk 中的控制结构对 1749 年到 2005 年之间的 12 个数字中的每一个数字进行增量平均。
这是一种方法:
awk '{a[] += ; b[] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
为了说明,下图首先按月平均,然后按年平均。这是使用 awk 的内置数组功能 - 其中“a”数组存储总和,“b”保留增量计数,最后用于总和的除以计算平均值。
$ awk '{a[] += ; b[] += 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[] += ; b[] += 1} END{for (i in a) print i, a[i]/b[i]}' years.txt | sort -n
1749 81.0833
1750 81.5