我已经查看了“类似问题”,但似乎没有一个能解决我的问题:
我有一个很大的 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,y
x,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
如果当前计算的值
avgy
与avgy
输出文件中记录的最后一个值的差异小于 10% ,则不要将新值写入输出文件。
查看编辑历史
这是一个通用的变体:
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行块类似的方式处理剩菜。