使用bash的前十个文本文件的平均值

时间:2017-07-19 16:26:08

标签: bash awk

我有两列文件。第一列是日期,第二列包含相应的数字。这两个逗号由一列分隔。我想取前三个数字的平均值并将其打印到一个新文件。然后对第2到第4个数字做同样的事情。然后是3日到5日等等。例如:

File1

date1,1  
date2,1  
date3,4  
date4,1  
date5,7  

输出文件

2  
2  
4 

有没有办法用awk或其他工具做到这一点?

4 个答案:

答案 0 :(得分:0)

根据Ed Morton的有用反馈

所做的更改进行了更新

这是一个快速而肮脏的脚本来完成你所要求的。它没有太大的灵活性,但你可以很容易地弄清楚如何扩展它。 要运行将其保存到文件中并使用shebang行或通过调用 awk -f

将其作为awk脚本执行
// {
  Numbers[NR]=$2;
  if ( NR  >= 3 ) {
    printf("%i\n", (Numbers[NR] + Numbers[NR-1] + Numbers[NR-2])/3)
  }
}

BEGIN {
  FS=","
}

说明:

第1行:匹配所有行,“/”是匹配运算符,在这种情况下,我们有一个空匹配,这意味着“在每一行都做这件事”。


第3行:使用记录编号(NR)作为密钥并存储第2列中的值
第4行:如果我们从文件中读取3个或更多值
第5行:进行数学运算并打印为整数
BEGIN块:将字段分隔符更改为逗号“,”。

答案 1 :(得分:0)

<强>输入

akshay@db-3325:/tmp$ cat file.txt 
date1,1
date2,1
date3,4
date4,1
date5,7 

akshay@db-3325:/tmp$ awk -v n=3 -v FS=, '{
    x = $2;
    i = NR % n;
    ma += (x - q[i]) / n;
    q[i] = x;
    if(NR>=n)print ma;
}' file.txt
2
2
4

或者低于一个用于绘制和保持参考轴(在您的案例日期中)在平均点中心的一个

<强>脚本

akshay@db-3325:/tmp$ cat avg.awk 
BEGIN {
    m=int((n+1)/2)
}
{L[NR]=$2; sum+=$2}
NR>=m {d[++i]=$1}
NR>n {sum-=L[NR-n]}
NR>=n{
    a[++k]=sum/n
}
END {
    for (j=1; j<=k; j++)
        print d[j],a[j]          # remove d[j], if you just want values only
}

<强>输出

akshay@db-3325:/tmp$ awk -v n=3 -v FS=, -v OFS=, -f avg.awk file.txt 
date2,2
date3,2
date4,4

答案 2 :(得分:0)

如果您的Input_file与显示的示例相同,如果您想要提供与您提到的相同的输出,那么您可以尝试关注并告诉我这是否对您有帮助。

awk -F, -v RS="" '{for(i=2;i<=NF-4;i+=2){print ($i+$(i+2)+$(i+4))/3}}'  Input_file

输出如下。

2
2
4

答案 3 :(得分:0)

mkeep=r//keep

在这里添加一些数学技巧,为每条记录设置$ awk -F, '{a[NR%3]=$2} (NR>=3){print (a[0]+a[1]+a[2])/3}' file 2 2 4 $2。因此,每个元素的值将循环更新。而[0],[1],[2]的总和将是过去3个数字的总和。