`awk`は指定された行数の列を合計できますか?

`awk`は指定された行数の列を合計できますか?

「似たような質問」を見ましたが、私の問題を解決するようには思えません。

大きな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出力ファイルに新しいデータポイントとして追加しません。代わりに、次avgxavgy次の値を計算します。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
    }
}

残りの食べ物は、塊と同じように処理する必要があると思います。窒素ワイヤー。

おすすめ記事