【问题标题】:Finding mean of column data in certain interval在一定间隔内查找列数据的平均值
【发布时间】:2016-09-26 17:25:36
【问题描述】:

我发现awk 可用于查找列的平均值,如here。假设我想计算第二列的平均值,但只计算特定行之间的元素(例如,从第 2 行到第 6 行)。如何做到这一点?

【问题讨论】:

  • 阅读How to Ask,然后阅读edit您的问题以提供缺失的信息。
  • @EdMorton:我浏览了“如何提问”部分。但我并没有完全看到缺少的信息。有什么具体的指示吗?

标签: ubuntu awk numerical-methods


【解决方案1】:
$ awk '$2>=2 && $2<=6 {sum+=$2; count++} 
                  END {print (count?sum/count:"N/A")}' file

【讨论】:

  • 这不适用于科学格式的数据。例如,+5.68902179E+00
  • 我意识到我的问题不够清晰。我进行了编辑。我的意思是访问特定行间隔之间的列,而不是特定值之间的列。
  • 使用FNR找到解决方案
【解决方案2】:

我找到了解决方案。 awk 有参数 FNR 暗示记录数,通常表示行号。在 karakfa 的 solution 上使用这个:

awk 'FNR>=2 && FNR<=6 {sum+=$2; count++} 
   END {print (count?sum/count:"N/A")}' file

【讨论】:

    【解决方案3】:

    试试:

    $ awk -v s=2 -v e=6  '{if(($2>=s)&&($2<=e)){sum+=$2;n++}}END{print (n!=0)?sum/n:0}' input.txt
    

    解释:

    #!/bin/awk
    
    BEGIN {
        start = 2
        end = 6
    }
    
    {
        if( ($2 >= start) && ($2 <= end) )
        {
            sum = sum + $2
            n = n + 1
        }
    }
    
    END {
        print ( n!= 0) ? sum / n : 0
    }
    
    #eof#
    

    希望对你有帮助!

    【讨论】:

    • 要学习 awk,请阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。 awk 不是 C。
    • NR 不会是总和的记录数!您必须使用实际计数进行平均计算。
    • 现在你必须处理n==0的情况,否则你会得到fatal: division by zero attempted的错误。
    • 在 awk 中编写 { if (condition) action } 就像在 C 中编写 if (true) { if (condition) action } }。希望您不会在 C 中编写它,所以不要在 awk 中编写等价物,它只是 condition { action }。但是,当您用答案解决问题时,它将与@karakfa 的答案相同。
    猜你喜欢
    • 2019-08-01
    • 2021-08-22
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2019-11-10
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多