我有一个时间步长的数据文件1024
,如下所示:
1 0.240112 0.0610352 1.00659
2 0.240112 0.0610352 1.00659
...
1024 0.237366 0.0576172 1.00189
我想做两件事——
- 通过对每 N 行的值进行平均,将行数减少 N 倍。因此,例如,对于 N=16,我将剩下 1024/16=64 行数据
- 对呈指数增长的行数求平均值。例如,如果我想对每 2^N 行(从 1-2、3-4、5-8、9-16 等)求平均值。在这种情况下,我将剩下 log_2(1024)=10 行。
我可以使用grep
或awk
或某些此类命令来执行此操作吗?
答案1
第一个任务:
awk '
BEGIN {
N = 16;
}
{
for(i = 1; i <= NF; i++) {
arr[i] += $i;
}
}
NR % N == 0 {
for(i = 1; i <= NF; i++) {
printf "%s ", arr[i] / N;
}
print "";
delete arr;
}' input.txt
第二个任务:
awk '
BEGIN {
N = 2;
}
{
for(i = 1; i <= NF; i++) {
arr[i] += $i;
}
}
NR % N == 0 {
for(i = 1; i <= NF; i++) {
printf "%s ", arr[i] / (N - M);
}
print "";
delete arr;
M = N;
N *= 2;
}' input.txt