对每N行求平均值,并将平均值附加为一个新列,最好是在ceil(N/2)位置



我对awk很陌生,我试图修改awk每N行装箱的解决方案,但遗憾的是,我没能正确地将平均值作为新列添加到我的文件中。

在第一列中,我有日期/时间戳,然后在接下来的列中有一些数据。我需要一个(稍后可能更多(数据列的每N行的平均值。作为第一个解决方案,我会尝试将第N行旁边的特定平均值写入一个新列,并且中间的行没有条目(例如,对于N=100:从0-99没有新输出,但在第100行中,我从所选列获得最后100个值的平均值(

我的最终目标是将计算出的平均值附加到每个ceil(N/2(行。因此,N=100的平均值将被附加在第50行。

由于我只有有限的知识和资源来解决这个问题,我可能会多次运行awk,并尝试先将结果输出到一个临时文件中,然后尝试合并它

非常感谢!

附言:事实上,它不一定只有awk,我只是觉得它可能是最合适的解决方案。

编辑:我的数据如下:

-9,787440e+00;1,8;29,2;0,0033;0,0405;-0,0006;0,0102
-9,787360e+00;-1,90735e-07;28,8;0,0017;0,0033;0,00012;-0,00956
-9,787280e+00;-1,90735e-07;29,4;0,0017;0,0405;0,00036;0,0102
-9,787200e+00;1,8;29;0,0033;0,0093;0,00156;-0,00764
-9,787120e+00;8;29,4;0,0093;0,0405;0,00316;0,0102
-9,787040e+00;15,6;29;0,0167;0,0129;0,00332;-0,00636

在第一列中,我有相对时间戳,其他值是测量值。现在假设N=3,我需要一个新列中第6列的平均值。理想情况下,结果应该是这样的:

-9,787440e+00;1,8;29,2;0,0033;0,0405;-0,0006;0,0102
-9,787360e+00;-1,90735e-07;28,8;0,0017;0,0033;0,00012;-0,00956**;−0,00004**
-9,787280e+00;-1,90735e-07;29,4;0,0017;0,0405;0,00036;0,0102
-9,787200e+00;1,8;29;0,0033;0,0093;0,00156;-0,00764
-9,787120e+00;8;29,4;0,0093;0,0405;0,00316;0,0102**;0,00268**
-9,787040e+00;15,6;29;0,0167;0,0129;0,00332;-0,00636

我尝试将新添加的条目标记为粗体**。因此,对于N=3,列6的每3行的平均值应该被添加到每个平均窗口的中间。ceil(3/2(=2,在计算出新的平均值之后每隔一行。

编辑2:我设法将计算出的平均值每N行追加一次——现在我需要将其向后移N/2行。用awk或其他一些bash工具,这可能吗?总的来说,它应该相当快——我必须浏览65Mb的.csv文件。非常感谢!

BEGIN { 
N=3
OFS=FS = ";";
}
{ 
sum+=$1
}
{
if (NR%N==0) {
my_add_col=sum/N
sum=0
$(NF+1)=my_add_col
}
}
{
print $0
}

让我假设;

  • 小数分隔符是逗号
  • 记录的数量是N的倍数

那么请尝试以下操作:

LC_ALL=fr_FR.UTF-8 awk --use-lc-numeric -F";" -v N=3 '
{
sum += $6               # accumulate the value in the 6th field
list[(NR-1)%N+1] = $0   # store current line in an array (to be displayed later)
}
NR%N==0 {                   # the line number is a multiple of N
ave = sum / N
ceil = int((N + 1) / 2) # the line to add the column of the average
for (i = 1; i < ceil; i++) print list[i]
print list[ceil] ";" ave
for (i = ceil + 1; i <= N; i++) print list[i]
sum = 0                 # initialize sum for the next iteration
delete list             # initialize list of lines
}
' data.txt

相关内容

最新更新