我有两列文件。第一列是日期,第二列包含相应的数字。这两个逗号由一列分隔。我想取前三个数字的平均值并将其打印到一个新文件。然后对第2到第4个数字做同样的事情。然后是3日到5日等等。例如:
File1
date1,1
date2,1
date3,4
date4,1
date5,7
输出文件
2
2
4
有没有办法用awk或其他工具做到这一点?
答案 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行:匹配所有行,“/”是匹配运算符,在这种情况下,我们有一个空匹配,这意味着“在每一行都做这件事”。
答案 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个数字的总和。