bash添加具有相同第一列的列

时间:2012-11-30 17:12:49

标签: bash unix uniq

我有一个文件在第一列中有一个名字,在第二列中有一个数字。它按名称排序。

    dan 3355
    dan 667
    dan 889
    frank 8
    frank 99
    frank 90
    ian 9

我想组合所有相同的名称并输出每个名字的总数:

    dan 4911
    frank 197
    ian 9

我知道我可以使用uniq来获取相同行的总数,但是如何保留我在数据中的计数呢?

2 个答案:

答案 0 :(得分:5)

您可以使用awk的关联数组:

 awk '{arr[$1]+=$2;} END {for (i in arr) print i, arr[i]}' filename

答案 1 :(得分:1)

使用awk的关联存储器并不能保证名称将以与输入相同的顺序出现在输出中(并且对于大型数据集可能是内存效率低下的)。

请改用以下内容

awk '(NR==1){oldname=$1;s=$2;next};
     (oldname == $1){s=s+$2;next};
     {print oldname, s;oldname=$1s=$2;next}
     END{print oldname,s}'