【问题标题】:awk count pattern matches and sum the numbers after themawk 计数模式匹配并对它们后面的数字求和
【发布时间】:2017-02-26 03:26:09
【问题描述】:

我有一个重复多次的具有以下模式的文件:

<Content>Un relax en el ritmo trepidante de New York   showReview(14443615, 'full');
<Date>Mar 22, 2008
<Overall rating>3
<No. Reader>-1
<No. Helpful>-1
<Overall>5

所以我试图计算&lt;Overall&gt; 的出现次数不计算 &lt;Overall rating&gt;。然后我想对每个 &lt;Overall&gt; 标签后面的数字求和。这是我的代码。

 awk -F'>' '$1=="<Overall" BEGIN{}
    {
        count++
        sum+=$2
    }
    END{printf "%.2f\n", sum/count}' *filename*

【问题讨论】:

  • 如果您删除 BEGIN 部​​分,您的代码似乎可以正常工作
  • 您的BEGIN 放错了位置。应该是' BEGIN{} $1=="&lt;Overall"{...}。但由于BEGIN 部分为空,您可以将其删除...

标签: linux bash awk


【解决方案1】:

另一种方法

$ awk -F'<Overall>' 'NF==2 {sum+=$2; c++} 
                     END   {print (c?sum/c:0)}' file

【讨论】:

    【解决方案2】:

    如果我理解正确,您想将所有包含 &lt;Overall&gt; 的行的值相加:

    awk 'BEGIN{FS=">";sum=0} $0~/<Overall>/ {sum+=$2} END{print sum}' file
    

    一个例子是包含以下行的文件总和为175

    ...
    <Overall>25
    <Overall>75
    ...
    <Overall>50
    ...
    <Overall>25
    ...
    

    【讨论】:

    • 恕我直言,OP想要找到平均值,即总模式计数的总和值。
    • @Inian:哪里有提到平均值? summean 不是一回事...
    • ok 同意平均值见 OP 尝试中的总和/计数。没有不尊重的意思,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多