【问题标题】:AWK to print the names and numbers greater than the averageAWK 打印大于平均值的名称和数字
【发布时间】:2021-05-12 13:54:25
【问题描述】:

这是文件:

Alpha Beta Omega 100 95 90
One Two Three Four Five 13 24 50
Yes No 70 70 70
João Édipo Schültz 40 50 60

平均值必须设置为 70,因此三个数字 %3 必须等于/大于 70。答案(输出)应该是:

Alpha Beta Omega 100 95 90
Yes No 70 70 70

我尝试使用它来隔离数字,但无法删除带有~^ 之类的字母:

awk -F"[a-zA-Z=&\"]*" '{print $2,$3,$4}'

我如何使用 AWK 来做到这一点?谢谢!

【问题讨论】:

  • 您要取该行中三个数字的平均值并与 70 进行比较?
  • Yes No 69 70 70 行想要的结果是什么?由于平均值为 ,因此打印该值是否为 =70?

标签: shell awk


【解决方案1】:

你可以使用:

awk -v p=70 '{for (i=NF-3; i<=NF; ++i) if ($i < p) next} 1' file

Alpha Beta Omega 100 95 90
Yes No 70 70 70

只要最后 3 列中的任何一列小于在命令行中设置为 70 的变量 pif ($i &lt; p) next 就会跳过一条记录。

如果要比较的数字可以在一行中的任何位置,则使用:

awk -v p=70 '{for (i=1; i<=NF; ++i) if (+$i == $i && $i < p) next} 1' file

如果列是数字,+$i == $i 返回 true。

【讨论】:

  • Yes 1 或任何非零最后都会打印该行
【解决方案2】:

如果行中的 any 值超过 70 或者找到的数字的平均值超过 70,则不清楚您是否要打印这些行?

如果是任意行中的值:

awk -v x=70 '{for(i=1;i<=NF;i++) if($i+0==$i && $i>=x) {print; next}}' file

如果是找到的数字的平均值

awk -v x=70 '{
        sum=cnt=0
        for(i=1;i<=NF;i++) if($i+0==$i) {cnt++; sum+=$i}
        if ((sum/cnt)>=x) print
        }' file

两个打印:

Alpha Beta Omega 100 95 90
Yes No 70 70 70

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多