パーセントの追加と計算

パーセントの追加と計算

2 つのデータ列があり、列 A に重複レコード数を追加し、列 B で数を計算し、数の割合を計算しようとしています。例:

494   1
494
494
494   1
500
500   1
500
501
501
501  1
501

494の場合、4つのレコードと2つのカウントがあるので、2/4 = 0.50などを計算しようとしています。

答え1

簡単な例として、これはawk非常に複雑です。

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}

実行するには、awkスクリプトfrac-calcと数字を入力してnumber実行します。

( cat number; echo ) | awk -E frac-calc

出力は次のとおりです。

494 0.5
500 0.333333
501 0.25

これはecho、列Aが異なるため、最後のブロック501の結果が印刷されることを保証するために必要です。

長いリストかもしれません。

( cat number; echo ) | awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}'

編集する:コメントに記載されているように使用しENDて使用したくない場合は:echo

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}
END {
      print A,b/a  # Print result
}

そしてそれを呼び出す:

awk -E frac-calc number

これにより、単一の裏地が少し長くなります。

awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}END{print A,b/a}' number

答え2

最初のバージョン - 2D配列を使用します。

gawk '
BEGIN {
    PROCINFO["sorted_in"] = "@ind_num_asc";
}
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt

このPROCINFO["sorted_in"] = "@ind_num_asc";行の説明は次のとおりです。事前定義された配列スキャン順序の使用

gawkこの場合、出力を次のコマンドにパイプして置き換えることができますsort -n

gawk '
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt | sort -n

2番目のバージョン - 配列がないより最適化されたバリアントです。

gawk '
NR == 1 { 
    record = $1;
}
record != $1 {
    print record, tallies / cnt;    
    record = $1;
    cnt = 0;
    tallies = 0;
}
{
    cnt++;
    tallies += $2;
}
END {
    print record, tallies / cnt;    
}' input.txt

出力:

494 0.5
500 0.333333
501 0.25

関連情報