Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57098
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类:

2011-10-07 14:55:59

文本:
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()取整的值。

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