文本:
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
- 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(),该函数就是取整数位。
- 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) |