Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1306862
  • 博文数量: 213
  • 博客积分: 7590
  • 博客等级: 少将
  • 技术积分: 2185
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-31 17:31
个人简介

热爱开源,热爱linux

文章分类

全部博文(213)

文章存档

2018年(4)

2017年(1)

2015年(1)

2014年(5)

2013年(2)

2012年(2)

2011年(21)

2010年(82)

2009年(72)

2008年(23)

分类: LINUX

2010-12-27 22:03:11

下面是在网上看到的一个比较经典的帖子,时间长了,当时将内容做了笔记,现在再看了看,把它写到cu上,因为经典,还可以经常复习复习
#假设我有如下文件:
#cat data
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#现在我想把第一列中字段相同的合并,第一列不相同的则保留,
#合并的原则就是保留第一个出现的前两个字段,第三个字段则把结果相加,以上面的示例为例:
#
#就是对于123开头的需要合并,合并后应该成为如下:
#cat data
#123 def1 1898
#345 def2 812
#322 def4 684
#请问用shell如何实现?
#要求总结:
#1 合并相同的第一列数据,并且计算第三列和
#2 第二列只保留第一次出现
#3 第一列顺序不变
下面是用awk进行实现的,觉得很经典

#!/bin/bash

awk 'BEING{n=0}
{
     a[$1]+=$3
     if(length(b[$1])==0)b[$1]=$2
     if($1 in ind)next
     ind[$1]
     key[n]=$1
     n++
}
END{
     for(i in key)print key[i],b[key[i]],a[key[i]]
}'
data1


阅读(1302) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~