【问题标题】:Find average of numbers from a specific line从特定行查找数字的平均值
【发布时间】:2017-04-19 16:56:17
【问题描述】:

我有一个包含 2 列数字的文本文件。

10 2
20 3
30 4
40 5 
50 6
60 7 
70 8 
80 9
90 10
100 11
110 12
120 13
130 14

我想求第 6 行第 2 列数据的平均值。即((7+8+9+10+11+12+13+14)/8 = 10.5)

我可以找到这个帖子Scripts for computing the average of a list of numbers in a data file 并使用了以下内容:

awk'{s+=$2}END{print "ave:",s/NR}' fileName

但我得到的是整个第二列数据的平均值。

这里有任何提示。

【问题讨论】:

  • 你试过什么?我们这里的大多数人都很乐意帮助你提高你的手艺,但作为短期无偿编程人员不太乐意。在MCVE 中向我们展示您迄今为止的工作、您期望的结果以及您得到的结果(或错误),我们将帮助您解决问题。
  • 我个人认为我的例子解释得足够清楚。我尝试了上述帖子中提供的 sn-p。但它在这里为您服务。 awk'{s+=$2}END{print "ave:",s/NR}' 文件名
  • @SaideepPavuluri:你能创建一个超过 15 行的实际文件并告诉我们你想要什么吗?
  • @SaideepPavuluri,您的问题仍然不包含代码,并且您链接到的问题有很多答案。如果您进行了尝试,则该尝试应包含在您的问题中。
  • @Inian .. 我觉得没有错,他说的是“从第 6 行开始”,而不是“之后”。跨度>

标签: awk average


【解决方案1】:

这个单行应该做:

awk -v s=6 'NR<s{next} {c++; t+=$2} END{printf "%.2f (%d samples)\n", t/c, c}' file

这个 awk 脚本有三个模式/动作对。第一个负责跳过第一个s 行。第二个在每一行执行(从s 开始);它增加一个计数器并将第 2 列添加到运行总计中。在处理完所有数据后第三次运行,并打印您的结果。

【讨论】:

  • NR&lt;s{next} {c++; t+=$2} = NR&gt;=s{c++; t+=$2}。此外,只需将t/c 调整为(c?t/c:0) 或类似的值,以防止输入文件中的行数少于s 时出现除以零错误。
  • @EdMorton,没错,您的建议在功能上是等效的。在 gawk 中它似乎也稍快一些。但是,在 BSD awk 中,您的解决方案要慢 5% 左右。很高兴有这么多解决问题的方法。 ;-) 此外,重新除以零,这是一个很好的观点。不过,我不会将其添加到我的答案中,因为没有样本的平均值是未定义的(或合法错误),而不是零。
【解决方案2】:

下面的脚本应该可以完成这项工作

awk 'NR>=6{avg+=$2}END{printf "Average of field 2 starting from 6th line %.1f\n",avg/(NR-5)}' file

输出

Average of field 2 starting from 6th line 10.5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多