2017-07-19 43 views
-2

我有一个两列的文件。第一列是日期,第二列包含相应的编号。这两个逗号由一列分隔。我想把前三个数字的平均值打印到一个新文件中。然后为第2-4个号码做同样的事情。然后是3 - 5等等。例如:使用bash的前十个文本文件的平均数

文件1

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

输出文件

2 
2 
4 

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

+1

绝对。在档案中找到它。它不应该花很长时间。 –

+0

你可能也想谷歌“移动平均” –

+1

@詹姆斯,你应该已经付出了一些努力到你的问题。请参阅https://stackoverflow.com/help/how-to-ask –

回答

0

更新基于从埃德莫顿

由于做出了有益的反馈改变这里有一个快速和肮脏的脚本做你问什么。它没有太大的灵活性,但你可以很容易地找出如何扩展它。 要运行它保存到一个文件并执行它作为一个awk脚本或者用认领线或致电AWK -f

// { 
    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块:将字段分隔符更改为逗号“,”。

+0

你可以在代码 – hek2mgl

+0

中使用嵌入式注释'//不做任何事情,并且在读取第一行之后设置'FS' ** 。将其设置在BEGIN部分。 –

+0

我不同意//“什么都不做”。是的代码将没有它的工作,但它确实做了一些事情。 你对FS完全正确。我急匆匆地从我身旁滑过。感谢您指出它..现在编辑我的帖子... 非常感谢 –

0

输入

[email protected]:/tmp$ cat file.txt 
date1,1 
date2,1 
date3,4 
date4,1 
date5,7 

[email protected]:/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 

或低于一个作图并在平均点的中心保持参考轴线(你的情况日期)

脚本

[email protected]:/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 
} 
有用

输出

[email protected]:/tmp$ awk -v n=3 -v FS=, -v OFS=, -f avg.awk file.txt 
date2,2 
date3,2 
date4,4 
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 
0
$ awk -F, '{a[NR%3]=$2} (NR>=3){print (a[0]+a[1]+a[2])/3}' file 
2 
2 
4 

添加一点点的数学技巧在这里,每一个记录集$2a[NR%3]。所以每个元素的值都会循环更新。并且a [0],a [1],a [2]的总和将是过去3个数字的总和。

相关问题