zoukankan      html  css  js  c++  java
  • awk之腾迅面试题1

    1.题目如下:
    3 5 6 7
    2 3 1 0
    4 5 6 9
    2 3 4 4
    2 2 1 0
    4 5 0 9
    假如把2列和3列的值作为新的第5列,第5列的平均值为avg5,求第5列中大于avg5的行数。 
    1. awk '{x+=$2+$3;a[NR]=$2+$3}END{y=x/NR;for(i in a){if(y<a[i])z++}print z}' file

    [解析]

      这个题初看,觉得简单,仔细看又觉得有难度,否则腾讯这些大企业也不会出这么简单的题了,呵呵。首先来分析,第5列的值很好办 $2+$3,但是求平均值比较麻烦,麻烦的原因是只有最后END才可以通过累加的x的值来除以行数然后得出平均值,又有个一个新的问题,这时候已经END了,求出了平均值但是无法再从新历遍全文去比较每行的 $2+$3 是否大于该平均值,怎么着?总得有个东西来装 $2+$3 的结果吧,目的是将$2+$3的结果放入一个容器,在END求出平均值后再拿出来判断比较,惯例请出我们的老朋友数组。最后的大家都能看懂了吧。

    1. awk 'BEGIN{while(getline<"file"){x+=$2+$3;i++};y=x/i}{if($2+$3>y)z++}END{print z}' file

    [解析]

      这是7月22日更新的新命令,我新学会的一种处理手段,在BEGIN模块中利用 while(getline<"file") 来提前历遍全文,在BEGIN中我们可以看到,我已经把$2+$3的和累加给了x变量,但是求平均值必须要知道行数,怎么办呢?这时候在BEGIN中NR还是0,当然可以搞定了,我们这时候就不用NR自己建个变量来保存行数就好了嘛,这样我们可以顺利的在BEGIN模块中就已经求出了平均数了。然后按照正常的执行流程再逐行判断第2列和第3列的和是否大于这个平均数,最后打印统计结果。

  • 相关阅读:
    Java中类的继承
    信号量、PV原语及其应用
    Python-subprocess执行命令并将输出劫持实现实时记录到日志
    Python-logging模块定制格式描述符实现定长日志等级
    Python-logging模块实现同时向控制台和文件打印日志
    SpringBoot学习笔记(二)
    Kubernetes学习日记(四)
    Kubernetes学习日记(三)
    SpringBoot学习笔记(一)
    Kubernetes学习日记(二)
  • 原文地址:https://www.cnblogs.com/mmdln/p/8961698.html
Copyright © 2011-2022 走看看