我的 csv 文件中的第二列有重复项。我想根据这些重复项添加第 1 列中的关联值。
示例 csv :
56, cc=DK
49, cc=US
34, cc=GB
32, cc=DE
32, cc=NZ
31, cc=DK
31, cc=GB
31, cc=GB
示例结果:
96, cc=GB # where 96 = 34+31+31
87, cc=DK # where 87 = 56+31
32, cc=DE
32, cc=NZ
最佳答案
您可以在 awk
中使用关联数组:
awk '{s[$2]+=$1}END{for(k in s)print s[k]", ",k}' inFile
为了可读性对其进行扩展,并使用 sum/key
而不是 s/k
:
{ # Do for each line.
sum[$2] += $1 # Add first field to accumulator,
# indexed by second field.
# initial value is zero.
}
END { # Do this bit when whole file processed.
for (key in sum) # For each key like cc=US:
print sum[key] ", " key # Output the sum and key.
}
这是在我的盒子上运行的示例:
pax$ echo;echo '56, cc=DK
49, cc=US
34, cc=GB
32, cc=DE
32, cc=NZ
31, cc=DK
31, cc=GB
31, cc=GB' | awk '{s[$2]+=$1}END{for(k in s)print s[k]", "k}'
32, cc=DE
96, cc=GB
32, cc=NZ
49, cc=US
87, cc=DK
尽管第一列的形式是 999,
(注意末尾的逗号),但它仍然有效,只是因为 awk
,在计算字符串时数字上下文,仅使用在该上下文中有效的前缀。因此,45xyzzy
将变为 45
,更重要的是,49,
变为 49
。
关于Bash - 根据列在行中添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29385613/