LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1356|回复: 6

请问如何分类求和

[复制链接]
发表于 2008-2-14 17:05:50 | 显示全部楼层 |阅读模式
假如我的输出是
a                     b
------------------------------------------
1                     2
1                     3
1                     3
2                     1
2                     0
2                     5
3                     7

什么命令可以让输出是
a                     b
-----------------------------------
1                     8
2                     6
3                     7

谢谢各位
发表于 2008-2-15 20:08:34 | 显示全部楼层
假设脚本名mysort.sh, 内容如下:
  1. #!/bin/sh
  2. sed -n '1,2p' $1
  3. sed '1,2d' $1 | awk '{ array[$1] += $2 }
  4.         END { for (i in array)
  5.                 print i, array[i]
  6.         }'  # | sort
复制代码
则运行如下:  $ mysort.sh <yourfile>

note:
1. 为了保留前两行,只得用sed分离然后分别处理
2. awk的数组不保留顺序,需要排列的话,则将 'sort' 前的'#'去掉即可
回复 支持 反对

使用道具 举报

发表于 2008-2-16 07:06:57 | 显示全部楼层
$ perl -lane '$sum{$F[0]} += $F[1]; END { print "$_ $sum{$_}" foreach sort keys %sum };' guilei.txt
1 8
2 6
3 7

$ cat guilei.txt
1 2
1 3
1 3
2 1
2 0
2 5
3 7
回复 支持 反对

使用道具 举报

发表于 2008-2-16 17:20:16 | 显示全部楼层
比较复杂的Python版:
  1. #!/usr/bin/python
  2. import sys
  3. array = {}
  4. input = open(sys.argv[1], 'r')
  5. # process the first 2 lines
  6. for _ in range(0, 2):
  7.         print input.readline(),
  8. nums = input.readline().split()
  9. while nums:
  10.         array[nums[0]] = array.get(nums[0], 0) + int(nums[1])
  11.         nums = input.readline().split()
  12. input.close()
  13. for num in array.keys():
  14.         print num, array[num]
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-2-17 14:00:52 | 显示全部楼层
厉害,学习收藏拉!
回复 支持 反对

使用道具 举报

发表于 2008-2-19 11:30:13 | 显示全部楼层
awk '{if(NR>2)a[$1]+=$2;else print}END{for(i in a)printf i" "a"\n"}'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-20 13:49:50 | 显示全部楼层
收藏了,这东西后来我用awk也实现了,嘿嘿
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表