如何对按另一个值中的值分组的列中的值求和

时间:2014-03-24 18:02:13

标签: perl bash

我有一个包含2列数据的大文件

100 5
100 10
100 10
101 2
101 4
102 10
102 2

我想将第2列中的值与第1列中的匹配值相加。对于此示例,我期望的输出是

100 25
101 6
102 12

我正在努力使用bash脚本来解决这个问题。有人可以解释我怎么能这样做

5 个答案:

答案 0 :(得分:4)

使用awk

awk '{a[$1]+=$2}END{for(i in a){print i, a[i]}}' inputfile

为了您的输入,它会产生:

100 25
101 6
102 12

答案 1 :(得分:2)

您可以使用关联数组。第一列是索引,第二列是您添加的索引。

#!/bin/bash

declare -A columns=()

while read -r -a line ; do
  columns[${line[0]}]=$((${columns[${line[0]}]} + ${line[1]}))
done < "${1}"

for idx in ${!columns[@]} ; do
  echo "${idx} ${columns[${idx}]}"
done

答案 2 :(得分:2)

穿着perl one liner

perl -lane "$s{$F[0]} += $F[1]; END { print qq{$_ $s{$_}} for keys %s}" file.txt

答案 3 :(得分:0)

Python是我的选择:

d = {}
for line in f.readlines():
   key,value = line.split()
   if d[key] == None:
      d[key] = 0
   d[key] += value

print d

为什么要使用bash脚本?

答案 4 :(得分:0)

使用awk并维护订单:

awk '!($1 in a){a[$1]=$2; b[++i]=$1;next} {a[$1]+=$2} END{for (k=1; k<=i; k++) print b[k], a[b[k]]}' file
100 25
101 6
102 12