
「似たような質問」を見ましたが、私の問題を解決するようには思えません。
大きな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
入力ファイルより小さい出力ファイルを生成する必要があります。出力ファイルには以下が含まれます。以下 一行すべてNライン入力ファイルに。出力ファイルの各行はx,y
データポイントです。平均x,y
価値Nライン入力ファイル。
たとえば、入力ファイルの総行数は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
出力ファイルの1行に対応します。
私はしばらくこの問題に対処しましたが、まだ正しく解決していません。これが私が処理してきたことですが、どうすればいいのかわかりません。繰り返しNR
ファイル全体の値を繰り返します。
awk -F ',' 'NR == 1, NR == 3 {sumx += $1; avgx = sumx / 3; sumy += $2; avgy = sumy / 3} END {print avgx, avgy}' CB07-Small.csv
この問題をより複雑にするには、出力ファイルをさらに「スリミング」する必要があります。
avgy
(上記で計算された)値が次の場合閉鎖出力ファイルの最後の値については、avgy
出力ファイルに新しいデータポイントとして追加しません。代わりに、次avgx
とavgy
次の値を計算します。Nライン入力ファイル。「閉鎖」最後の値の割合として定義する必要がありますargy
。たとえば、
現在計算されている値が
avgy
出力ファイルに書き込まれた最後の値の10%以内にある場合は、新しいavgy
値を出力ファイルに書き込まないでください。
編集履歴を見る
答え1
一般的なバリエーションは次のとおりです。
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
}
}
残りの食べ物は、塊と同じように処理する必要があると思います。窒素ワイヤー。
答え2
回線の状態と10%のルールを確認してください。 10%の規則に小切手の価値が線形に増加する副作用があることを覚えなさい。
$ awk -F ',' '
BEGIN{
N=3; prev_y=0
}
{
x+=$1;
y+=$2;
i++
}
NR%N==0 && (y/i) <= (prev_y)*1.1{ x=0; y=0; i=0 }
NR%N==0 && (y/i) > (prev_y)*1.1{
print x/i","y/i;
prev_y=y/i; x=0; y=0; i=0
}' file