`awk` 可以对指定行数的列求和

Sea*_*mus 7 awk numeric-data

我已经查看了“类似问题”,但似乎没有一个能解决我的问题:

我有一个很大的 CSV 输入文件;文件中的每一行都是一个x,y数据点。这里有几行用于说明,但请注意,通常数据不是 单调的

1.904E-10,2.1501E+00  
3.904E-10,2.1827E+00  
5.904E-10,2.1106E+00  
7.904E-10,2.2311E+00  
9.904E-10,2.2569E+00  
1.1904E-09,2.3006E+00  
Run Code Online (Sandbox Code Playgroud)

我需要创建一个小于输入文件的输出文件。对于输入文件中的每N 行,输出文件将包含不超过 一行。在输出文件中的每个单个线将是一个数据点,这是平均的的值N行的输入文件。x,yx,y

例如,如果输入文件中的总行数为 3,000,并且N=3,则输出文件将包含不超过1,000 行。使用上面的数据来完成这个例子,上面的前 3 行数据将被替换为一行,如下所示:

x = (1.904E-10 + 3.904E-10 + 5.904E-10) / 3 = 3.904E-10

y = (2.1501E+00 + 2.1827E+00 + 2.1106E+00) / 3 = 2.1478E+00,或:

3.904E-10,2.1478E+00 
Run Code Online (Sandbox Code Playgroud)

对于输出文件的一行。

我已经摆弄了一段时间,但还没有弄好。这是我一直在使用的,但我看不到如何迭代NR值以处理整个文件:

awk -F ',' 'NR == 1, NR == 3 {sumx += $1; avgx = sumx / 3; sumy += $2; avgy = sumy / 3} END {print avgx, avgy}' CB07-Small.csv
Run Code Online (Sandbox Code Playgroud)

为了更复杂一点,我需要进一步“精简”我的输出文件:

如果avgy(如上计算)的值接近avgy输出文件中的最后一个值,我不会将其作为新数据点添加到输出文件中。相反,我将从输入文件的下N 行计算下一个avgx&avgy值。“关闭”应定义为 的最后一个值的百分比。例如:argy

如果当前计算的值avgyavgy输出文件中记录的最后一个值的差异小于 10% ,则不要将新值写入输出文件。

查看编辑历史

Ste*_*itt 8

这是一个通用的变体:

BEGIN { OFS = FS = "," }

{
    for (i = 1; i <= NF; i++) sum[i] += $i
    count++
}

count % 3 == 0 {
    for (i = 1; i <= NF; i++) $i = sum[i] / count
    delete sum
    count = 0
    if ($NF >= 1.1 * last || $NF <= 0.9 * last) {
        print
        last = $NF
    }
}


END {
    if (count > 0) {
        for (i = 1; i <= NF; i++) $i = sum[i] / count
        if ($NF >= 1.1 * last || $NF <= 0.9 * last) print
    }
}

Run Code Online (Sandbox Code Playgroud)

我假设应该以与N行块类似的方式处理剩菜。