各列のデータ量が等しくない場合、賢明に合計する方法は?

各列のデータ量が等しくない場合、賢明に合計する方法は?

私は各列の平均を計算するためにこのawkスクリプトを使用しています。各列のデータポイントが同じ場合、スクリプトは正常に動作します。誰もがこのスクリプトを修正するのに役立ちます。
列のデータポイントは次のとおりです(サンプルファイルですが、実際のファイルには10000クーロンが含まれています)。

1 3 4 5   
2 3 5 6  
5 4 5 6  
6 6 6  
7 7  
8   
{
    for(i=1; i<=NF; i++) {
        a[i]+=$i
        if($i!="")
            b[i]++}
    }
END {
    for(i=1; i<=NF; i++)
        printf "%s%s", a[i]/b[i], (i==NF?ORS:OFS)
}

ベストアンサー1

反復中で、NF最後の入力行に達すると1だけです。配列の長さを繰り返し計算する必要があります。

また、スペースで区切られたデータ構造を見ると、空の変数がないため、どちらかifをテストする必要はありません。

awk '{
    for(i=1; i<=NF; i++) {
        a[i]+=$i; b[i]++
    }
END {
    for(i=1; i<=length(a); i++)      #<-----iterate over length(a) not NF
        printf "%s%s", a[i]/b[i], (i==length(a)?ORS:OFS)
}' file

@kusalanandaのコメントによると、あなたのawkバージョンがこの方法で配列長の決定をサポートしていない場合は、入力中の最大フィールド数を見つける必要があります。

awk '{max = (max < NF) ? NF : max;
    for(i=1; i<=NF; i++) {
        a[i]+=$i; b[i]++}
    }
END {
    for(i=1; i<=max; i++)
        printf "%s%s", a[i]/b[i], (i==max?ORS:OFS)
}' file

おすすめ記事