我在表单的文本文件中有数据:
1
1 2
1 2
1 4
1 6
2
2 1
2 2
2 3
2 4
3
3 1
3 5
3 9
3 11
Run Code Online (Sandbox Code Playgroud)
对于具有相同 ID(第一列)的行,我想添加一列,该列将第 2 列中的所有值加到前一行。其中所需的输出:
1
1 2
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 14
Run Code Online (Sandbox Code Playgroud)
我即将通过以下方式实现:
awk -v OFS='' 'NR == 1 {
next
}
{
print $0, (NR > 1 && p1 == $1 ? " " (sum+=p2) : "")
}
{
p1 = $1
p2 = $2
}' input > output
Run Code Online (Sandbox Code Playgroud)
但是,这是对第 2 列中的所有值求和,而不仅仅是具有相同 ID 的值。所以输出对于 ID=1 是正确的,但显然变得更糟:
1 2
1 2 2
1 4 4
1 6 8
2
2 1 8
2 2 9
2 3 11
2 4 14
3
3 1 14
3 5 15
3 9 20
3 11 29
Run Code Online (Sandbox Code Playgroud)
如何更改我的总和以仅包含正确的部分?(具有相同 ID 的行)
打印当前行后增加计数。
awk '{print $1, $2, sum[$1]; sum[$1] += $2}' file
Run Code Online (Sandbox Code Playgroud)
1
1 2 0
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 15
Run Code Online (Sandbox Code Playgroud)
这利用了 awk 将未定义变量视为空字符串或(在数字上下文中)为零的优势。
如果您不想0
打印增量总和,请使用
if ($2 != "") sum[$1] += $2
Run Code Online (Sandbox Code Playgroud)