使用 shell 或 bash 定位块平均大型 csv 文件
Using shell or bash to position block average large csv files
假设我有一些看起来像这样的数据
1,2,2
3,4,5
4,5,6
1,2,3
4,5,6
1,2,2
包含在 csv 文件中。现在我想这样定位块平均值:添加块(例如两行)然后取平均值:
1,2,2
3,4,5
+
4,5,6
1,2,3
+
4,5,6
1,2,2
这会给
9,12,14
5,8,10
按块数 (3) 平均为:
3,4,4.67
1.67,2.67,3.33
有没有在 awk、sed、grep 或 pure bash 中实现此目的的简单方法?我的真实数据以 GB 为单位,因此它确实需要非常高效。
开始方法如下:
$ cat tst.awk
BEGIN{ FS=OFS="," }
{
for (i=1;i<=NF;i++) {
sum[((NR-1)%2)+1,i] += $i
}
}
END {
for (j=1;j<=2;j++) {
for (i=1;i<=NF;i++) {
printf "%s%s", sum[j,i], (i<NF?OFS:ORS)
}
}
}
$ awk -f tst.awk file
9,12,14
5,8,10
我稍后会查看您是否对如何完成它有疑问。
假设我有一些看起来像这样的数据
1,2,2
3,4,5
4,5,6
1,2,3
4,5,6
1,2,2
包含在 csv 文件中。现在我想这样定位块平均值:添加块(例如两行)然后取平均值:
1,2,2
3,4,5
+
4,5,6
1,2,3
+
4,5,6
1,2,2
这会给
9,12,14
5,8,10
按块数 (3) 平均为:
3,4,4.67
1.67,2.67,3.33
有没有在 awk、sed、grep 或 pure bash 中实现此目的的简单方法?我的真实数据以 GB 为单位,因此它确实需要非常高效。
开始方法如下:
$ cat tst.awk
BEGIN{ FS=OFS="," }
{
for (i=1;i<=NF;i++) {
sum[((NR-1)%2)+1,i] += $i
}
}
END {
for (j=1;j<=2;j++) {
for (i=1;i<=NF;i++) {
printf "%s%s", sum[j,i], (i<NF?OFS:ORS)
}
}
}
$ awk -f tst.awk file
9,12,14
5,8,10
我稍后会查看您是否对如何完成它有疑问。