如何基于不同列的唯一值添加列值

时间:2018-08-29 14:54:57

标签: bash awk

我正在尝试根据A列中的唯一值在B列中添加值。如何使用AWK(或其他任何使用bash的方式)呢?

Column_A | Column_B
--------------------
A        | 1
A        | 2
A        | 1
B        | 3
B        | 8
C        | 5
C        | 8

结果:

Column_A | Column_B
--------------------
A        | 6
B        | 11
C        | 13

3 个答案:

答案 0 :(得分:0)

考虑到您的Input_file与显示的相同,并按第一个字段排序,请您尝试以下操作(将过早编辑解决方案以进行对齐)。

awk '
BEGIN{
  OFS=" | "
}
FNR==1 || /^-/{
  print
  next
}
prev!=$1 && prev{
  print prev,sum
  prev=sum=""
}
{
  sum+=$NF
  prev=$1
}
END{
  if(prev && sum){
    print prev,sum
  }
}'  Input_file

答案 1 :(得分:0)

另一个awk

$ awk 'NR<3 {print; next} 
            {a[$1]+=$NF; line[$1]=$0} 
       END  {for(k in a) {sub(/[0-9]+$/,a[k],line[k]); print line[k]}}' file

Column_A | Column_B
--------------------
A        | 4
B        | 11
C        | 13

请注意,A总计为4,而不是6。

答案 2 :(得分:-1)

一种可能的解决方案(假设文件为CSV格式):

输入:

$ cat csvtest.csv
A,1
A,2
A,3
B,3
B,8
C,5
C,8
$ cat csvtest.csv | awk -F "," '{arr[$1]+=$2} END {for (i in arr) {print i","arr[i]}}'
A,6
B,11
C,13