微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 合并第一列的结果然后将第二列汇总到第一列中每个条目的总计

我有Bash新手,所以请在这里忍受我.

我有一个由另一个软件(我无法控制)转储的文本文件,列出每个用户访问某些资源的次数,如下所示:

Jim 109
Bob 94
John 92
Sean 91
Mark 85
Richard 84
Jim  79
Bob  70
John 67
Sean 62
Mark 59
Richard 58
Jim  57
Bob  55
John 49
Sean 48
Mark 46
.
.
.

我的目标是获得这样的输出.

Jim  [Total for Jim]
Bob  [Total for Bob]
John [Total for John]

等等.

每次在软件中运行查询名称都会更改,因此对每个名称进行静态搜索,然后通过wc进行管道传输无效.

解决方法:

这听起来像awk的工作:)将程序的输出传递给以下awk脚本:

your_program | awk '{a[$1]+=$2}END{for(name in a)print name " " a[name]}'

输出

Sean 201
Bob 219
Jim 245
Mark 190
Richard 142
John 208

awk脚本本身可以用这种格式更好地解释:

# executed on each line
{
  # 'a' is an array. It will be initialized 
  # as an empty array by awk on it's first usage
  # '$1' contains the first column - the name
  # '$2' contains the second column - the amount
  #
  #  on every line the total score of 'name' 
  #  will be incremented  by 'amount'
  a[$1]+=$2
}
# executed at the end of input
END{
  # print every name and its score
  for(name in a)print name " " a[name]
}

注意,要获得按分数排序的输出,可以添加一个管道以对-r -k2进行排序. -r -k2以相反的顺序对第二列进行排序:

your_program | awk '{a[$1]+=$2}END{for(n in a)print n" "a[n]}' | sort -r -k2

输出

Jim 245
Bob 219
John 208
Sean 201
Mark 190
Richard 142

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐