对 AWK 中同一列的相邻行求和
To sum adjacent lines from the same column in AWK
我有一个文件:
A 1 20
B 2 21
C 3 22
D 4 23
我必须求第 0-3 行值的总和,然后是第 1 行到第 3 行的总和,最后是第 2 行到第 3 行的总和。最后一个值必须简单地为 0。换句话说,我想要得到一个包含两列的输出文件,其中的值是相邻行的总和,如下所示:
10 86
9 66
7 45
0 0
最后一行必须有两个零作为值。在 AWK 中如何实现?
这可能是您想要的:
$ tac file | awk 'NR==1{ print 0, 0; a=; b=; next} { print a+=, b+= }' | tac
10 86
9 66
7 45
0 0
通过在两个数组中累加总和来避免两个 tac
:
$ awk '{
for (i = 1; i <= NR; ++i) { sum2[i] += ; sum3[i] += }
}
END {
sum2[NR] = sum3[NR] = 0
for (i = 1; i <= NR; ++i) print sum2[i], sum3[i]
}' file
10 86
9 66
7 45
0 0
每一行的值都加到前面的所有行中。处理完所有行后,最后的值将清零并打印所有内容。
我有一个文件:
A 1 20
B 2 21
C 3 22
D 4 23
我必须求第 0-3 行值的总和,然后是第 1 行到第 3 行的总和,最后是第 2 行到第 3 行的总和。最后一个值必须简单地为 0。换句话说,我想要得到一个包含两列的输出文件,其中的值是相邻行的总和,如下所示:
10 86
9 66
7 45
0 0
最后一行必须有两个零作为值。在 AWK 中如何实现?
这可能是您想要的:
$ tac file | awk 'NR==1{ print 0, 0; a=; b=; next} { print a+=, b+= }' | tac
10 86
9 66
7 45
0 0
通过在两个数组中累加总和来避免两个 tac
:
$ awk '{
for (i = 1; i <= NR; ++i) { sum2[i] += ; sum3[i] += }
}
END {
sum2[NR] = sum3[NR] = 0
for (i = 1; i <= NR; ++i) print sum2[i], sum3[i]
}' file
10 86
9 66
7 45
0 0
每一行的值都加到前面的所有行中。处理完所有行后,最后的值将清零并打印所有内容。