Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3031723
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-07-22 09:24:17

文本:
abc   9
name  20
li    11
baa   13
sohu  16
yy    8
dff   12
tt    2
 
要求输出第2列是大于等于10的行,并在后面添加筛选的第2列的和除以13得到的整数作为第3列:
name  20 5
li    11 5
baa   13 5
sohu  16 5
dff   12 5
 
 
  1. awk '$2>9{a[++j]=$0;x+=$2}END{y=int(x/13);for(i=1;i<=j;i++)print a[i],y}' file
[解析]
  这题看起来简单,其实“没那么简单”,第一难点:是有选择性的存储,那么以NR为下标是肯定不合适的,因为不是连续性的数字递增,那么在后面取出数组下标时无法使用for循环递增来做,第二难点,awk的计算是保留小数位的,那么如何取整?答案是有的 int(),该函数就是取整数位。
 
 
  1. awk 'BEGIN{while(getline <"file")if($2>=10)sum+=$2;close("file");sum=int(sum/13)}$2>=10{print $0,sum}' file

[解析]

  这是非数组的解题方法,在大文件下它的效率比数组高很多,首先在BEGIN模块里通过while循环读入file文件的每行内容,把$2大于等于10的部分累加给一个变量,这样就预先求出了总和,然后按照正常执行的流程把$2大于等于10的行打印,并在后面输出int()取整的值。

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

ll1045672016-08-05 02:19:06

awk \'NR==FNR&&$2>=10{a+=$2}NR!=FNR&&$2>=10{print $0,int(a/13)}\' file file