【问题标题】:Compute average if satisfies the given condition in shell script如果满足 shell 脚本中的给定条件,则计算平均值
【发布时间】:2016-05-27 02:52:35
【问题描述】:

我有一个包含多种缺失值的数据集,例如 9990、9999、9999000、999999 等等。但都大于 9990。我想取每 24 个值的平均值。我正在尝试使用以下命令,但没有得到我想要的输出。

awk '{if ($1 < 9990) sum += $1; count++} NR%24==0{print count ? (sum) :9999;sum=count=0}'ifile

例如:我需要以下数据中每3行的平均值

3
3
4
9999
4
99990
13
3
999999
9999
9991
99954

我试过这个,但显示不同的结果:

awk '{if ($1 < 9990)sum += $1; count++} NR%3==0{print count ? (sum/count) :9999;sum=count=0}'ifile

我的愿望输出是

3.33
4     Average of 9999 4 99990 is done with 4/1. Because 9999 and 99990 are undefined values.
8    Average of 13 3 999999 is done with (13+8)/2. Because 999999 is an undefined value, so excluded from the average.
9999  All are undefined values, so denoted as 9999.

【问题讨论】:

  • 为什么 9999、9991 和 99954 的平均值等于 9999,而在所有其他情况下大于 9990 的值都会被忽略?
  • 您的 awk 脚本只是对大于 9990 的行求和。这不是与您想要的相反吗?您还需要 24 或 3 个值的平均值吗?对于 24,您的示例数据中没有足够的数据。
  • 是的。我现在修改了。但仍然没有打印出期望的结果。
  • 我认为我们都在指出问题、您的尝试和期望的输出似乎都解决了不同的问题 - 是什么?
  • 例如,当三行中的所有三行的值都大于 9990 时,即总和为零 - 为什么“平均值”为 9999?这是哪里来的?

标签: linux shell awk


【解决方案1】:
$1 < 9990 {
    sum += $1;
    count++;
}
NR % 3 == 0 {
    if (count == 0) {
        print "9999";
    } else {
        print sum / count;
    }
    sum = 0;
    count = 0;
}

当值为“未定义”时,您的错误是增加 count。如果你写

 {if ($1 < 9990) sum += $1; count++} 

那么if 语句在下一个分号处结束,而不是在右括号处。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多